2013-03-07 8 views
5

Ich habe window.onbeforeunload richtig triggern. Es wird ein Bestätigungsfeld angezeigt, um sicherzustellen, dass der Benutzer weiß, dass er das Fenster navigiert (schließt) und dass alle nicht gespeicherten Daten gelöscht werden.Wie erkennt man, wenn ein Link angeklickt wurde, wenn window.onbeforeunload ausgelöst wird?

Ich habe eine einzigartige Situation, in der ich nicht möchte, dass dies ausgelöst wird, wenn ein Benutzer durch Klicken auf einen Link von der Seite weg navigiert, aber ich kann nicht herausfinden, ob ein Link innerhalb der Funktion geklickt wurde um die Funktion zu stoppen. Dies ist, was ich für Code habe:

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

Antwort

6

Sie suchen nach verzögerter Ereignisbehandlung. Ich werde jQuery explain verwenden, da es weniger Code ist:

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

ein (sehr) Umsetzung des armen Mannes ohne jQuery bequem Delegation Handhabung könnte wie folgt aussehen:

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

diese alle Links können auf Ihre Seite zu verlassen, ohne den beforeunload Handler aufzurufen. Ich bin sicher, dass Sie herausfinden können, wie Sie dies anpassen können, wenn Sie dies nur für einen bestimmten Satz von Links zulassen möchten (Ihre Frage war nicht besonders klar).

+0

Das ist ein großer Dank für die Antwort. Ich versuche, dies ohne jQuery zu verwenden - und ich versuche herauszufinden, wie man die Poormans-Implementierung integriert, aber ich kann es nicht herausfinden (vergib mir, ich bin ein bisschen wie ein JS-Newb). – mirin

+0

Ihr Code war halb richtig. Ich habe die Frage mit der vollständigen Antwort beantwortet. – mirin

+0

Wenn jemand Probleme hat, es in IE arbeiten zu lassen, musste ich undefined anstelle von null zurückgeben. Funktioniert sowohl in ie als auch in Chrome. – Janspeed

3
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 
} 
1

Sie können mit Hilfe eines Timers zwischen einem link unload oder ein reload/user entering a different address unload s abweichen. Auf diese Weise wissen Sie, dass die beforeunload direkt nach dem Linkklick ausgelöst wurde.

Beispiel 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!'; 
    } 
}); 

(in Chrome getestet)

Verwandte Themen