Pregunta

Ok, he dedicado un tiempo a este problema y esto es lo que he reunido:

  1. Si realiza una llamada AJAX en IE7 y tiene especificada una función window.onbeforeunload, llama a la función onbeforeunload.

  2. Si intenta abrir una nueva ventana con window.open SIN alterar la ventana actual, se llama a onbeforeunload.

¿Alguien sabe cómo parar esto?¡Incluso intenté establecer una variable en VERDADERO y verificar esa variable en mi función onbeforeunload y todavía no funciona!Solo necesito poder detener la ejecución de ese método para llamadas AJAX y llamadas a nuevas ventanas.

¿Fue útil?

Solución

Otra opción y, probablemente, más simple es volver falsa cuando se abre la ventana emergente:

<a onclick="window.open(...); return false;" href="javascript:;" >my link</a>

Esto parece dejar de decir, de pensar que está dejando la página y que activa el evento. Todas las otras opciones no eran particularmente viable para mí.

Otros consejos

OK, he estado teniendo este problema. Tengo una (en lugar desordenado) evitar por ello.

En mi caso, quiero bloquear la navegación lejos a veces, y otras no.

Por lo tanto, yo soy la creación de una bandera en la ventana que me diga si lo quiero bloqueado. Entonces, ¿dónde usted está haciendo su window.open, justo antes de eso, ¿ 'window.allowExit = true', entonces en el onbeforeunload, comprobar si hay window.allowExit = true.

He la escritura de Java (ShowHelp) se inició a partir de un enlace:

<a href="javascript:ShowHelp('argument')" >HERE</a>

onbeforeunload se llama antes de la ShowHelp, por lo que utiliza la onclick para establecer el indicador

<a onclick="window.allowExit = true;" href="javascript:ShowHelp('argument')" >HERE</a>

feo como el pecado, pero parece que funciona!

Esta no es una solución, pero una explicación para alguien que está interesado.Me corrió una prueba rápida en IE 7, y dispara la onebeforeunload evento en cualquier momento hacer clic en un enlace, a menos que el HREF va a algún lugar en la misma página:es decir,a menos que contenga un #.Así que mi conjetura es que el IE ingenieros estaban pensando que cuando alguien hace clic en un vínculo que no es para cualquier lugar de la página, entonces debe salir de la página, en cuyo caso, la página que está a punto de descargar.No hace falta decir, hay evidencia de que los problemas con este pensamiento.

Me di cuenta de que sólo tiene que desarmar la función window.onbeforeunload antes de hacer nada y luego poner de nuevo cuando haya terminado.

Me acaba de terminar de desactivar la característica en el IE.

Yo tenía el mismo problema, en mi caso todas las solicitudes provienen de llamada AJAX, este simplificar la solución, porque cuando me fijo el porblem con botón estándar que hice una función recursiva para redirigir todo el onclick a mi función centralizada una continuación dispath la rigth clic. Estoy copiando la solución para la llamada AJAX suporting problema href también. Este evitar solución para volver a la página anterior. Poner el código dentro de un archivo llamado BackButton, js Cualquier comentario de escritura a mparma@usa.net~~V~~singular~~3rd con asunto: BackButton javascript

<!--  backbutton developed by Manuel Parma 2011-06-10 -->
<!--  email: mparma@usa.net -->
<!--  Add the next line into the <body> section as a first line  -->
<!--  <script type="text/javascript" src="<path>/backbutton.js"></script> -->

<!-- Address used when backtoLogin is 1 or when there is not previous page from site -->
var returningAddress = "http://my returning address"

<!-- Message to display when an external action (back button, forward button, backspace) move without press the application buttons -->
var backButtonMessage = "Using the browser's Back button may cause a loss in data. Please use the Back and Continue buttons at the bottom of the form."

<!-- 0=no / 1=yes (assume per default that the back button will be pressed -->
<!--               and come into action if this was NOT the case)          -->
var backButtonPressed = 1;    

<!--This var when is setted to 1 avoid to captureEvent set backbuttonPressed to 1, otherwise unload event cannot detect the right state of backButtonPressed-->
var onbeforeunloadeventFired = 0;

<!--Indicate to logic back to first page (login) when its value is 1 otherwise the logic back to previous page out of the site-->
var backtoLogin = 0;
var DoPostBackWithOptionsHook = null;
var DoPostBackHook = null;


<!-- Check the previous status -->
if (window.name == ""){
    <!-- When window.name is empty, this is indicating the first call of site -->
    window.name = "L0001";
}
else { 
    if (window.name == "L0000_back"){
        <!-- In this condition the page is returning after a foward button press  -->
        setBackButton(0);
        window.name = "";

        <!-- the system reload the page to clean the data -->
        window.location.href = returningAddress;
    }
    else {
        if (window.name.indexOf("_back") > 4){
            <!-- when the word back is present, the previous call is sending a message that the back button was pressed and the site is going out -->

            <!-- get the internal counter -->
            var sLastValue = modifynamevalue(0);    

            <!-- set the count to go back -->
            var iCountBack = -(sLastValue * 1);
            if (backtoLogin == 1) {iCountBack++;};

            if (window.history.length - 2 < -iCountBack) {
                iCountBack = -(window.history.length - 2);
            }

            <!-- the site is flag that first page needs to reload -->
            window.name = "L0000_back";             
            setBackButton(0);

            <!-- the site is returning to the first page or previous -->
            window.history.go(iCountBack);
        }
        else {
            <!-- increase the internal counter -->
            var sLastValue = modifynamevalue(+1);
            window.name = "L" + sLastValue;
        }
    }
}

<!-- Set the events needed to manage the back and forwar button situations -->

$(document).ready(function(){
    if (typeof(Sys) == "object") {
        Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(beginRequest);
        Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endRequest);

        window.onbeforeunload = onbeforeunloadEvent;
        window.onunload = unloadEvent;
        DoPostBackWithOptionsHook = WebForm_DoPostBackWithOptions;
        WebForm_DoPostBackWithOptions = WebForm_DoPostBackWithOptionsHook;

        doPostBackHook = __doPostBack;
        __doPostBack =  __doPostBackHook;

    }

    });

function WebForm_DoPostBackWithOptionsHook(options) {
    setBackButton(0);
    return DoPostBackWithOptionsHook(options)
}

function __doPostBackHook(eventTarget, eventArgument) {
    if (backButtonPressed == 1) {
        setBackButton(0);
    }
    return doPostBackHook(eventTarget, eventArgument)
} 

function beginRequest(sender, args) {
    setBackButton(0);
    <!-- setting onbeforeunloadeventFired = 1 I take care to avoid anyone changed the Backbutton until endrequest -->
    onbeforeunloadeventFired = 1;
}


function endRequest(sender, args) {
    onbeforeunloadeventFired = 0;
    setBackButton(1);
}

<!-- unload event handler -->
function unloadEvent(evt) {
    <!-- double coundition using onbeforeunloadeventFired == 1 garantee avoid problemas with redirect operations -->
    if ((backButtonPressed == 1) && (onbeforeunloadeventFired == 1)) {
        <!-- decrement the internal counter -->
        var sLastValue = modifynamevalue(-1);
        window.name = "L" + sLastValue + "_back";
    }

    if (DoPostBackWithOptionsHook !== null) {
        WebForm_DoPostBackWithOptions = DoPostBackWithOptionsHook;
    };

    if (doPostBackHook !== null) {
        __doPostBack = doPostBackHook;
    };
}

<!-- on before unload -->
function onbeforeunloadEvent(evt) {
    onbeforeunloadeventFired = 1;
    if (backButtonPressed == 1) {
        return backButtonMessage;
    };
}


<!-- used to set right backButtonPressed-->
function setBackButton(value){
    if (value == 0) {
        backButtonPressed = 0;
    }
    else {
        if (onbeforeunloadeventFired == 0) {
            backButtonPressed = 1;
        }
    }
}


<!-- increment and decrment the internal counter stored into windows.name -->
function modifynamevalue(iIncrement){
    var iCount = (window.name.substring(1, 5) * 1) + iIncrement;

    if (iCount < 0) {
        iCount = 0;
    }

    var sNewValue = iCount.toString();

    sNewValue = "0000".substring(0, 4 - sNewValue.length) + sNewValue;
    return sNewValue;
}

Sid_M dijo un punto válido, con la que el diseño del navegador tenemos que diseñar nuestra aplicación en consecuencia.

¿Por qué ir de etiqueta de anclaje y href de ventanas emergentes, sólo tiene que utilizar el método onclick en la etiqueta o incluso etiqueta td y llamar a window.open

Un simple ejemplo de uno de mi solicitud

<td class="popuplink" onMouseOver="this.style.cursor='hand'" onclick="javascript:openMe('img/howitworks.png', 'pndpopup', 600,650)"><u> How it works</u></td>

¿Usted intentó retirar manejador del evento "onbeforeunload" antes de llamar a window.open? Esto puede ayudar, pero nunca he probado.

Esto podría muy posible resolver su problema!

Debido a que tuve un problema similar y de esta manera ir hecho!

window.onbeforeunload = warnFunction;
var warnRequired = true;
function warnFunction () {
    if (warnRequired) return ("Please Stay! Don't go!");
    return ;
}

Y cada vez que hago una llamada Ajax o popup otra ventana, acabo conjunto warnRequired a falso.

Otra cosa sólo ten en cuenta al realizar una llamada Ajax que se sincroniza bien la variable no podría haber sido establecido todavía! (Un desagradable Gotcha!)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top