2008-11-25 19 views
6

He publicado esto here, pero pensé que podría merecer una pregunta por sí mismo.ASP.NET linkbutton raise onBeforeUnload event twice

Lo que intento hacer es mostrar un cuadro de diálogo que le pregunta al usuario si quiere abandonar la página si hay cambios no guardados. Eso todo funciona bien. Pero el problema se describe a continuación:

¿Alguien ha encontrado el problema donde Internet Explorer desencadena el evento onbeforeunload dos veces? Mientras busqué en Google, descubrí que tiene algo que ver con el hecho de que para (entre otros) un botón de enlace ASP.NET el código HTML es <a href="javascript: __doPostBack....

Aparentemente, cuando IE encuentra un enlace que no tiene un href="#", desencadena el evento onbeforeunload. Luego, cuando confirme el cuadro de diálogo de javascript que mostramos, la página realizará la descarga "real" para navegar a la otra página y generar el evento onbeforeunload por segunda vez.

Una solución ofrecida en Internet es establecer una variable booleana y verificarla antes de mostrar el cuadro de diálogo. Entonces, la segunda vez, no se mostrará. Eso está bien, pero cuando el usuario cancela, la variable seguirá configurada. Entonces, la próxima vez que el usuario quiera abandonar la página, el diálogo ya no se mostrará.

Espero que esto sea un poco claro, y espero que alguien haya encontrado una forma de evitar esto?

Respuesta

10

En reacción a annakata: Sí, pero desea que el resultado del cuadro de diálogo sea utilizado por el navegador. Por lo tanto, podría pensar que usar 'return bFlag' haría el truco (o event.returnValue = bFlag), pero eso le da un segundo cuadro de diálogo. He encontrado una forma de evitarlo, gracias a this page. Es bastante simple en realidad:

var onBeforeUnloadFired = false; 

Utilice esta variable global aquí:

if (!onBeforeUnloadFired) { 
    onBeforeUnloadFired = true; 
    event.returnValue = "You'll lose changes!"; 
} 
window.setTimeout("ResetOnBeforeUnloadFired()", 1000); 

y luego implementar esa función:

function ResetOnBeforeUnloadFired() { 
    onBeforeUnloadFired = false; 
} 

Así que, en efecto, utilizar la bandera, pero restablecerla si el usuario hace clic en cancelar. No del todo como me gustaría, pero no he encontrado nada mejor.

+0

Creo que está tomando mi respuesta a literalmente. Quise decir que quieres guardar el valor de confirmación en una bandera que usas para verificar antes de mostrar el cuadro de diálogo. Supongo que llegaste allá :) – annakata

1

No he encontrado esto, pero seguramente podría establecer la variable de indicador para que sea igual al resultado del diálogo? Si el usuario cancela la bandera, por lo tanto, seguirá siendo falsa.

var bFlag = window.confirm('Do you want to leave this page?'); 
0

IE admite un evento en el objeto de documento llamado onstop. Este evento se dispara después del evento onbeforeunload, pero antes del evento onunload. Esto no es exactamente pertinente a su pregunta de dos diálogos, pero sigue siendo relevante para otras personas que podrían tropezar con este hilo (como yo lo hice).

El problema que estaba teniendo, era que necesitaba mostrar un mensaje de carga después de la activación del evento onbeforeunload. Todo está bien hasta que la página tenga algún tipo de diálogo de confirmación. El evento onbeforeunload se activa incluso si el usuario cancela y permanece en la página. Lo más fácil para mí fue mover mi lógica de visualización de "carga" a un controlador para document.onstop. Además de esto, debe verificar la propiedad readyState del objeto de documento, que es otro campo solo de IE. Si está "cargándose", significa que el usuario está realmente abandonando la página. Si es "completo", significa que el usuario se está quedando.

Si está de acuerdo con solo usar IE, entonces podría estar interesado en lo siguiente.

document.onstop = function() 
{ 
    try 
    { 
     if(document.readyState != "complete") 
     { 
      showLoadingDiv(); 
     } 
    } 
    catch(error) 
    { 
     handleError(error); 
    } 
} 
Cuestiones relacionadas