IE9 onbeforeunload chiamato due volte quando window.location è cambiato nell’evento del pulsante … riproduzione minima

Ho martellato e martellato e non posso andare da nessuna parte.

Ho un pulsante Annulla che fa un “window.location = ‘404.htm’;” quando si fa clic. Il gestore onbeforeunload si triggers due volte, ma solo se l’utente fa clic su “Resta su questa pagina” nella prima finestra di dialogo. Una normale navigazione (aggiornamento della pagina, vai alla pagina iniziale) il gestore onbeforeunload si triggers solo una volta.

Sono riuscito a riprodurre il comportamento con una quantità minima di HTML e script:

   Test page   
/* * Connecting the events via code makes no difference * document.forms[0].cmdCancel.onclick = function () { alert('Clicked cancel. About to navigate...'); window.location = '404.htm'; }; window.onbeforeunload = function () { return "Unsaved changes"; }; */

Ci sono molti successi per “onbeforeunload chiamato due volte”, ma nessuna riproduzione minima e nessuna soluzione reale.

Eventuali suggerimenti?

    Grazie!

    Prova questo, questo ha funzionato per me. Questa soluzione è stata originariamente pubblicata da Amit su http://social.msdn.microsoft.com/Forums/eu/sharepointinfopath/thread/13000cd8-5c50-4260-a0d2-bc404764966d?prof=required

    Ricordare, disabilitando temporaneamente onbeforeunload e abilitandolo di nuovo dopo un breve periodo di tempo è la chiave.

     var checkChangesEnabled = true; window.onbeforeunload = confirmExit; function confirmExit() { if(checkChangesEnabled) { event.returnValue = "You have not saved your document yet."; disableCheck(); } } function disableCheck() { checkChangesEnabled = false; setTimeout("enableCheck()", "100"); } function enableCheck() { checkChangesEnabled = true; } 

    Poiché in ogni caso il tuo onbeforeunload viene interpretato tramite JS, probabilmente puoi utilizzare un flag booleano in una variabile globale per sapere se è la prima volta che il processo viene avviato dall’esecuzione dell’evento. Piace:

      ...    ... 

    Un’altra possibilità forse, dato che secondo questo post il problema sembra venire dal cambiare la pagina usando JS, puoi usare un hyperlink nascosto per cambiare la pagina usando HTML, qualcosa del tipo:

      

    Quindi il tuo pulsante potrebbe fare:

      

    Supponendo che tutto ciò funzioni, un collegamento nascosto come quello è un brutto attacco (la prima possibilità non è molto più carina in ogni caso), ma ciò che non richiede alcuni brutti hack quando si tratta di avere un comportamento MSIE come se fosse un browser web. ..

    Con il prossimo codice, puoi risolvere questo problema in ogni caso:

     window.location = 'javascript:window.location = "http://www.google.com"'; 

    Ho scoperto che è chiamato due volte quando si usano i controlli postback e tag non asp. Cambia i comandi da a , ecc. Per risolvere questo problema.

    Penso di aver trovato una soluzione più pulita al problema. Ho impostato il onbeforeunload su null all’interno del callback e lo ho resettato prima di uscire:

     ... window.onbeforeunload=confirmExit; function confirmExit(){ window.onbeforeunload=null; event.returnValue="You have not saved your document yet."; window.onbeforeunload=confirmExit; }