Pregunta

Estoy creando una ventana emergente que tiene instalado un controlador anterior a la descarga. Cuando el " Cerrar " El elemento del menú de archivo se usa para cerrar la ventana emergente, el controlador antes de descargar se llama dos veces, lo que da como resultado dos "¿Está seguro de que desea cerrar esta ventana?" mensajes que aparecen.

Este es un error con Firefox, y he lo reporté aquí , pero todavía me gustaría una forma de evitar que esto suceda. ¿Puedes pensar en una forma sensata de detectar el doble antes de la descarga para evitar el problema del doble mensaje? El problema es que Firefox no me dice en qué botón del cuadro de diálogo eligió el usuario: Aceptar o cancelar.

¿Fue útil?

Solución 3

Esto definitivamente es un error de FF. Lo he informado en https://bugzilla.mozilla.org/show_bug.cgi? id = 531199

Otros consejos

<script type="text/javascript">
var onBeforeUnloadFired = false;

window.onbeforeunload = function ()
{
    if (!onBeforeUnloadFired) {
        onBeforeUnloadFired = true;
        event.returnValue = "You have attempted to leave this page.  If you have made any changes to the fields without clicking the Save button, your changes will be lost.  Are you sure you want to exit this page?";
   }

   window.setTimeout("ResetOnBeforeUnloadFired()", 10);
}

function ResetOnBeforeUnloadFired() {
   onBeforeUnloadFired = false;
}    
</script>

Establezca una variable en el controlador para evitar que el diálogo aparezca por segunda vez. Use setTimeout para restablecerlo después.

La mejor solución que he encontrado es usar una variable global de indicador que se restablece después de tantos milisegundos, digamos 500 (esto asegura que la función se pueda volver a llamar, pero no inmediatamente después de su aparición).

Ver el último código en:

http: // social .msdn.microsoft.com / Forums / es / sharepointinfopath / thread / 13000cd8-5c50-4260-a0d2-bc404764966d

He encontrado este problema en Chrome 21, Firefox 14, IE 7-9, Safari 5 (en PC).

Lo siguiente funciona en todos estos navegadores. Si se elimina la función window.onbeforeunload durante el evento, esto evitará la segunda llamada. El truco es restablecer la función window.onbeforeunload si el usuario decide permanecer en la página.

var window_on_before_unload = function(e) {
    var msg;
    // Do here what you ever you need to do
    msg = "Message for user";

    // Prevent next "window.onbeforeunload" from re-running this code.
    // Ensure that if the user decides to stay on the page that
    // this code is run the next time the user tries to leave the page.
    window.onbeforeunload = set_on_before_unload;

    // Prepare message for user
    if (msg) {
        if (/irefox\/([4-9]|1\d+)/.test(navigator.userAgent))
            alert(msg
                    + '\n\nThe next dialog will allow you to stay here or continue\nSee Firefox bug #588292');

        (e = e || window.event).returnValue = msg;
        return msg;
    }
};

// Set window.onbeforeunload to the above handler.
// @uses window_on_before_unload
// @param {Event} e
var set_on_before_unload = function(e) {
    // Initialize the handler for window.onbeforeunload.
    window.onbeforeunload = window_on_before_unload;
}

// Initialize the handler for window.onbeforeunload.
set_on_before_unload();

Cree una variable global que se establece en verdadero dentro del controlador. Solo muestre la alerta / ventana emergente cuando esta variable sea falsa.

Utilizo el siguiente fragmento para rastrear la cuenta de salida

Cuando la página carga la siguiente variable exitCount se inicializa

if (typeof(MTG) == 'undefined') MTG = {};
MTG.exitCount=0; 

y en el evento de descarga de la ventana

$(window).bind("beforeunload", function(){


            if (MTG.exitCount<=0) 
            {

                             //do your thing, save etc
            }   
            MTG.exitCount++;




});

He descubierto que, en lugar de hacer su propia llamada para confirmar (), simplemente haga even.preventDefault (); dentro del evento beforeunload. Firefox lanza su propio diálogo de confirmación. No estoy seguro de si esto es lo correcto / estándar, pero así es como lo están haciendo.

Tengo un documento que abre otra ventana emergente con window.open. En la ventana original, he registrado (con jquery) un oyente para `` descargar '' evento como este:

var popup_window = window.open(...) 
$(popup_window).on('unload', function(event) ...

Me encontré con esta página porque el evento se activó efectivamente dos veces. Lo que he encontrado es que no es un error, se dispara dos veces porque se dispara una vez por "en blanco". página reemplazada por su página y otra por su página que se está descargando.

Todo lo que tengo que hacer es filtrar el evento que me interesa consultando el evento original:

function (event) {
   var original_url = e.originalEvent.originalTarget.URL;
   if (original_url != 'about:blank')
   {
       ... do cool things ...
   }
}

No sé si esto se aplica a la pregunta original, porque es un caso especial de una ventana que abre otra, pero espero que ayude.

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