Domanda

Sto creando una finestra pop-up in cui è installato un gestore beforeunload. Quando il pulsante " Chiudi " la voce di menu file viene utilizzata per chiudere il popup, il gestore beforeunload viene chiamato due volte, risultando in due "Sei sicuro di voler chiudere questa finestra? " messaggi visualizzati.

Questo è un bug con Firefox e l'ho segnalato qui , ma vorrei comunque un modo per impedire che ciò accadesse. Riesci a pensare a un modo sano di rilevare il doppio scaricamento precedente per evitare il problema del doppio messaggio? Il problema è che Firefox non mi dice quale pulsante nella finestra di dialogo l'utente ha scelto di fare clic su: OK o Annulla.

È stato utile?

Soluzione 3

Questo è sicuramente un bug FF. L'ho segnalato su https://bugzilla.mozilla.org/show_bug.cgi? id = 531199

Altri suggerimenti

<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>

Imposta una variabile nel gestore per evitare che la finestra di dialogo venga visualizzata per la seconda volta. Utilizzare setTimeout per ripristinarlo in seguito.

La migliore soluzione che ho trovato è usare una variabile globale flag che viene resettata dopo tanti millisecondi, diciamo 500 (questo assicura che la funzione possa essere richiamata di nuovo, ma non immediatamente dopo il suo aspetto).

Vedi l'ultimo codice in:

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

Ho riscontrato questo problema in Chrome 21, Firefox 14, IE 7-9, Safari 5 (su PC).

Quanto segue funziona su tutti questi browser. Se si rimuove la funzione window.onbeforeunload durante l'evento, ciò impedirà la seconda chiamata. Il trucco è ripristinare la funzione window.onbeforeunload se l'utente decide di rimanere nella pagina.

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();

Crea una variabile globale impostata su true all'interno del gestore. Mostra l'avviso / popup solo quando questa variabile è falsa.

Uso il seguente frammento per tenere traccia del exitcount

Quando la pagina carica la seguente variabile exitCount è inizializzata

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

e nell'evento di scaricamento della finestra

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


            if (MTG.exitCount<=0) 
            {

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




});

Ho scoperto che invece di fare la tua chiamata per confirm (), fai anche even.preventDefault (); all'interno dell'evento beforeunload. Firefox attiva la propria finestra di dialogo di conferma. Non sono sicuro che questa sia la cosa corretta / standard da fare, ma è così che lo stanno facendo.

Ho un documento che apre un'altra finestra popup con window.open. Nella finestra originale ho registrato (con jquery) un ascoltatore per " scarica " evento come questo:

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

Mi sono imbattuto in questa pagina perché l'evento si è effettivamente attivato due volte. Quello che ho scoperto è che non è un bug, si innesca due volte perché si attiva una volta per "about: blank". pagina sostituita dalla tua pagina e un'altra per la tua pagina da scaricare.

Tutto quello che devo fare è filtrare l'evento che mi interessa interrogando l'evento originale:

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

Non so se questo si applica alla domanda originale, perché è un caso speciale di apertura di un'altra finestra, ma spero che sia di aiuto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top