come rilevare se è stato fatto clic su un collegamento quando viene triggersto window.onbeforeunload?

Ho window.onbeforeunload di avvio correttamente. Sta visualizzando una finestra di conferma per assicurarsi che l’utente sappia che sta navigando (chiudendo) la finestra e che qualsiasi lavoro non salvato verrà cancellato.

Ho una situazione unica in cui non voglio che questo si inneschi se un utente si allontana dalla pagina facendo clic su un collegamento, ma non riesco a capire come rilevare se è stato fatto clic su un collegamento all’interno della funzione per arrestare la funzione . Questo è quello che ho per il codice:

window.onbeforeunload = function() { var message = 'You are leaving the page.'; /* If this is Firefox */ if(/Firefox[\/\s](\d+)/.test(navigator.userAgent) && new Number(RegExp.$1) >= 4) { if(confirm(message)) { history.go(); } else { window.setTimeout(function() { window.stop(); }, 1); } } /* Everything else */ else { return message; } } 

Stai cercando la gestione degli eventi posticipati. Spiegherò usando jQuery, dato che è un codice in meno:

 window._link_was_clicked = false; window.onbeforeunload = function(event) { if (window._link_was_clicked) { return; // abort beforeunload } // your event handling }; jQuery(document).on('click', 'a', function(event) { window._link_was_clicked = true; }); 

un’implementazione (molto) povera senza che la pratica gestione delle deleghe di jQuery possa essere simile a:

 document.addEventListener("click", function(event) { if (this.nodeName.toLowerCase() === 'a') { window._link_was_clicked = true; } }, true); 

questo consente a tutti i collegamenti della pagina di uscire senza richiamare il gestore di beforeunload . Sono sicuro che puoi capire come personalizzare questo, se vuoi permetterlo solo per una serie specifica di link (la tua domanda non era particolarmente chiara su questo).

 var link_was_clicked = false; document.addEventListener("click", function(e) { if (e.target.nodeName.toLowerCase() === 'a') { link_was_clicked = true; } }, true); window.onbeforeunload = function() { if(link_was_clicked) { link_was_clicked = false; return; } //other code here } 

È ansible distinguere tra uno link unload o un reload/user entering a different address unload utilizzando un timer. In questo modo sai che il beforeunload stato triggersto direttamente dopo il clic del link.

Esempio utilizzando jQuery:

 $('a').on('click', function(){ window.last_clicked_time = new Date().getTime(); window.last_clicked = $(this); }); $(window).bind('beforeunload', function() { var time_now = new Date().getTime(); var link_clicked = window.last_clicked != undefined; var within_click_offset = (time_now - window.last_clicked_time) < 100; if (link_clicked && within_click_offset) { return 'You clicked a link to '+window.last_clicked[0].href+'!'; } else { return 'You are leaving or reloading the page!'; } }); 

(testato in Chrome)