Das beforeunload
Ereignis wird ausgelöst, wenn der Benutzer Ihre Seite aus irgendeinem Grund verlässt.
Es wird beispielsweise ausgelöst, wenn der Benutzer ein Formular sendet, auf einen Link klickt, das Fenster (oder die Registerkarte) schließt oder über die Adressleiste, das Suchfeld oder ein Lesezeichen zu einer neuen Seite wechselt.
Sie können Formularübermittlungen und Hyperlinks (außer von anderen Frames) mit dem folgenden Code ausschließen:
var inFormOrLink;
$('a').on('click', function() { inFormOrLink = true; });
$('form').on('submit', function() { inFormOrLink = true; });
$(window).on("beforeunload", function() {
return inFormOrLink ? "Do you really want to close?" : null;
})
Versuchen Sie Folgendes für jQuery-Versionen, die älter als 1.7 sind:
var inFormOrLink;
$('a').live('click', function() { inFormOrLink = true; });
$('form').bind('submit', function() { inFormOrLink = true; });
$(window).bind("beforeunload", function() {
return inFormOrLink ? "Do you really want to close?" : null;
})
Die live
Methode funktioniert nicht mit dem submit
Ereignis. Wenn Sie also ein neues Formular hinzufügen, müssen Sie den Handler ebenfalls daran binden.
Beachten Sie, dass Sie die Bestätigungsaufforderung verlieren, wenn ein anderer Ereignishandler die Übermittlung oder Navigation abbricht, wenn das Fenster später tatsächlich geschlossen wird. Sie können dies beheben, indem Sie die Zeit in den submit
und click
Ereignissen aufzeichnen und überprüfen, ob beforeunload
dies mehr als ein paar Sekunden später geschieht.
Ctrl + r
,F5
,Ctrl + Shift + r
und die Browser - URL zu ändern?.on()
.Binden Sie den
beforeunload
Ereignishandler möglicherweise einfach im Ereignishandler des Formulars aufsubmit
:quelle
onsubmit=...
in jedes Formular aufnehmen. (Ich habe viele Formulare pro Seite in einer bestimmten Webanwendung)Verwenden Sie für eine browserübergreifende Lösung (getestet in Chrome 21, IE9, FF15) den folgenden Code, bei dem es sich um eine leicht optimierte Version des Slaks-Codes handelt:
Beachten Sie, dass seit Firefox 4 die Meldung "Möchten Sie wirklich schließen?" wird nicht angezeigt. FF zeigt nur eine generische Nachricht an. Siehe Hinweis unter https://developer.mozilla.org/en-US/docs/DOM/window.onbeforeunload
quelle
live
als auch diebind
Anweisungen aktualisierton
, was mit der neuesten Version von jQuery hervorragend funktioniert. Vielen Dank!quelle
Für eine Lösung, die mit Steuerelementen von Drittanbietern wie Telerik (z. B. RadComboBox) und DevExpress, die die Anchor-Tags aus verschiedenen Gründen verwenden, gut funktioniert, sollten Sie den folgenden Code verwenden, bei dem es sich um eine leicht optimierte Version des Desm-Codes mit einer besseren Auswahl für sich selbst handelt Targeting von Ankertags:
quelle
Meine Antwort zielt darauf ab, einfache Benchmarks bereitzustellen.
WIE MAN
Siehe @ Slaks Antwort .
Wie lange dauert es, bis der Browser Ihre Seite endgültig herunterfährt?
Immer wenn ein Benutzer die Seite schließt ( xSchaltfläche oder CTRL+ W), führt der Browser den angegebenen
beforeunload
Code aus, jedoch nicht auf unbestimmte Zeit. Die einzige Ausnahme ist das Bestätigungsfeld (return 'Do you really want to close?
), das auf die Antwort des Benutzers wartet.Chrome : 2 Sekunden.
Firefox : ∞ (oder Doppelklick oder Erzwingen beim Schließen)
Kante : ∞ (oder Doppelklick)
Explorer 11 : 0 Sekunden.
Safari : TODO
Was wir verwendet haben, um dies zu testen:
Es sendet so viele Anfragen wie möglich, bevor der Browser seine Seite herunterfährt (synchron).
Chrome-Ausgabe:
quelle
Ich habe die Antwort von Slaks verwendet, aber das hat nicht so funktioniert, da der Rückgabewert onbeforeunload als Zeichenfolge analysiert und dann im Bestätigungsfeld des Browsers angezeigt wird. Daher wurde der Wert true wie "true" angezeigt.
Nur mit Return hat funktioniert. Hier ist mein Code
quelle
Vielleicht könnten Sie OnSubmit verarbeiten und ein Flag setzen, das Sie später in Ihrem OnBeforeUnload-Handler einchecken.
quelle
quelle
Leider wird das Ereignis ausgelöst, unabhängig davon, ob es sich um ein erneutes Laden, eine Umleitung neuer Seiten oder ein Schließen des Browsers handelt. Eine Alternative besteht darin, die ID abzufangen, die das Ereignis auslöst. Wenn es sich um ein Formular handelt, wird keine Funktion ausgelöst. Wenn es sich nicht um die ID des Formulars handelt, tun Sie, was Sie tun möchten, wenn die Seite geschlossen wird. Ich bin mir nicht sicher, ob das auch direkt möglich und langweilig ist.
Sie können einige kleine Dinge tun, bevor der Kunde die Registerkarte schließt. Javascript erkennt Browser schließen Tab / Browser schließen, aber wenn Ihre Liste von Aktionen groß ist und der Tab geschlossen wird, bevor es beendet ist, sind Sie hilflos. Sie können es versuchen, aber meiner Erfahrung nach hängen Sie nicht davon ab.
https://developer.mozilla.org/en-US/docs/Web/Reference/Events/beforeunload?redirectlocale=de-US&redirectslug=DOM/Mozilla_event_reference/beforeunload
quelle
Wenn Ihre Formularübermittlung sie auf eine andere Seite weiterleitet (wie ich annehme, daher das Auslösen von
beforeunload
), können Sie versuchen, Ihre Formularübermittlung in einen Ajax-Aufruf zu ändern. Auf diese Weise verlassen sie Ihre Seite nicht, wenn sie das Formular senden, und Sie können Ihrenbeforeunload
Bindungscode nach Ihren Wünschen verwenden.quelle
Mein Problem: Das Ereignis "onbeforeunload" wird nur ausgelöst, wenn eine ungerade Anzahl von Übermittlungen (Klicks) vorliegt. Ich hatte eine Kombination von Lösungen aus ähnlichen Threads in SO, damit meine Lösung funktioniert. Nun, mein Code wird sprechen.
quelle
Ab jQuery 1.7 ist die .live () -Methode veraltet. Verwenden Sie .on (), um Ereignishandler anzuhängen. Benutzer älterer Versionen von jQuery sollten .delegate () anstelle von .live () verwenden.
auf vollständig oder Link
quelle
Versuchen Sie dies auch
quelle
Überprüfen Sie einfach ...
quelle
quelle
Das Folgende hat für mich funktioniert;
quelle
event.clientY
ist negativ, wenn Sie auf die Schaltfläche zum Schließen des Browsers oder zum Schließen der Registerkarte klicken. Dieser Wert ist jedoch positiv, wenn Sie die Seite mithilfe von Tastaturkürzeln (F5, Strg-R) neu laden oder den Browser mithilfe von Tastaturkürzeln (z. B. Alt-F4) schließen. Daher können Sie sich nicht auf die Ereignisposition verlassen, um das Ereignis zum Schließen des Browsers vom Ereignis zum erneuten Laden der Seite zu unterscheiden.