Window: beforeunload event
Limited availability
This feature is not Baseline because it does not work in some of the most widely-used browsers.
Das beforeunload
-Ereignis wird ausgelöst, wenn das aktuelle Fenster, das enthaltene Dokument und die zugehörigen Ressourcen entladen werden sollen. Das Dokument ist zu diesem Zeitpunkt noch sichtbar und das Ereignis kann noch abgebrochen werden.
Der Hauptanwendungsfall dieses Ereignisses ist das Auslösen eines browsergenerierten Bestätigungsdialogs, der Benutzer fragt, ob sie wirklich die Seite verlassen möchten, wenn sie versuchen, sie zu schließen, neu zu laden oder woanders hin zu navigieren. Dies soll helfen, den Verlust ungespeicherter Daten zu verhindern.
Der Dialog kann auf folgende Weise ausgelöst werden:
- Aufrufen der Methode
preventDefault()
des Ereignisobjekts. - Setzen der Eigenschaft
returnValue
des Ereignisobjekts auf einen nicht-leeren Zeichenfolgenwert oder einen anderen wahrheitsgetreuen Wert. - Zurückgeben eines wahrheitsgetreuen Werts aus der Ereignishandlerfunktion, z.B.
return "string"
. Beachten Sie, dass dies nur funktioniert, wenn die Funktion über dieonbeforeunload
-Eigenschaft und nicht über die MethodeaddEventListener()
angehängt wird. Dieses Verhalten ist in modernen Versionen von Firefox, Safari und Chrome konsistent.
Die letzten beiden Mechanismen sind veraltete Funktionen; die beste Praxis ist, den Dialog durch Aufruf von preventDefault()
auf dem Ereignisobjekt auszulösen, während returnValue
gesetzt wird, um veraltete Fälle zu unterstützen.
Syntax
Verwenden Sie den Ereignisnamen in Methoden wie addEventListener()
oder setzen Sie eine Ereignishandler-Eigenschaft.
addEventListener("beforeunload", (event) => { })
onbeforeunload = (event) => { }
Ereignistyp
Ein BeforeUnloadEvent
. Erbt von Event
.
Nutzungshinweise
Um den Dialog anzuzeigen, wenn der Benutzer den Tab schließt oder navigiert, sollte eine beforeunload
-Ereignishandlerfunktion preventDefault()
auf dem Ereignisobjekt aufrufen. Sie sollten beachten, dass moderne Implementierungen:
- Eine sticky activation erfordern, damit der Dialog angezeigt wird. Das bedeutet, der Browser zeigt das Dialogfeld nur an, wenn das Fenster oder ein eingebettetes Fenster eine Benutzergeste oder Benutzerinteraktion erhält. Wenn der Benutzer nie mit der Seite interagiert hat, gibt es keine Benutzerdaten zu speichern, also keinen legitimen Anwendungsfall für den Dialog.
- Nur eine vom Browser vorgegebene Zeichenfolge im angezeigten Dialog zeigen. Dies kann nicht durch den Code der Webseite gesteuert werden.
Das beforeunload
-Ereignis weist einige Probleme auf:
-
Es wird nicht zuverlässig ausgelöst, insbesondere auf mobilen Plattformen. Beispielsweise wird das
beforeunload
-Ereignis in folgendem Szenario überhaupt nicht ausgelöst:- Ein mobiler Benutzer besucht Ihre Seite.
- Der Benutzer wechselt dann zu einer anderen App.
- Später schließt der Benutzer den Browser aus dem App-Manager.
Hinweis: Es wird empfohlen, das
visibilitychange
-Ereignis als ein zuverlässigeres Signal für das automatische Speichern des Anwendungszustands zu verwenden, das Probleme wie das oben genannte umgeht. Weitere Details finden Sie unter Don't lose user and app state, use Page Visibility. -
In Firefox ist
beforeunload
nicht mit dem back/forward cache (bfcache) kompatibel: Das heißt, Firefox speichert Seiten nicht im bfcache, wenn siebeforeunload
-Listener haben, was schlecht für die Leistung ist.
Es wird daher empfohlen, dass Entwickler nur dann auf beforeunload
hören, wenn Benutzer ungespeicherte Änderungen haben, damit der oben genannte Dialog verwendet werden kann, um sie vor drohendem Datenverlust zu warnen. Der Listener sollte wieder entfernt werden, wenn er nicht benötigt wird. Ein sparsames Abhören von beforeunload
kann die Auswirkungen auf die Leistung minimieren.
Ereignis-Handler-Aliase
Zusätzlich zur Window
-Schnittstelle ist die Ereignis-Handler-Eigenschaft onbeforeunload
auch bei den folgenden Zielen verfügbar:
Beispiele
Im folgenden Beispiel haben wir ein HTML-Text-<input>
-Element, um einige Daten darzustellen, die geändert werden könnten und das Speichern erfordern:
<form>
<input type="text" name="name" id="name" />
</form>
Unser JavaScript bindet einen input
-Ereignislistener an das <input>
-Element, der auf Änderungen des eingegebenen Wertes lauscht. Wenn der Wert auf einen nicht-leeren Wert aktualisiert wird, wird ein beforeunload
-Ereignislistener am Window
-Objekt angehängt.
Wenn der Wert wieder ein leerer String wird (d.h. der Wert wird gelöscht), wird der beforeunload
-Ereignislistener wieder entfernt – wie oben in den Nutzungshinweisen erwähnt, sollte der Listener entfernt werden, wenn keine ungespeicherten Daten vorhanden sind, vor denen gewarnt werden muss.
Die beforeunload
-Ereignishandlerfunktion ruft event.preventDefault()
auf, um den Warnhinweis-Dialog auszulösen, wenn der Benutzer den Tab schließt oder navigiert. Wir haben auch event.returnValue = true
in die Handlerfunktion aufgenommen, sodass alle Browser, die den event.preventDefault()
-Mechanismus nicht unterstützen, die Demo dennoch korrekt ausführen.
const beforeUnloadHandler = (event) => {
// Recommended
event.preventDefault();
// Included for legacy support, e.g. Chrome/Edge < 119
event.returnValue = true;
};
const nameInput = document.querySelector("#name");
nameInput.addEventListener("input", (event) => {
if (event.target.value !== "") {
window.addEventListener("beforeunload", beforeUnloadHandler);
} else {
window.removeEventListener("beforeunload", beforeUnloadHandler);
}
});
Wenn der <input>
-Wert nicht leer ist und Sie versuchen, die Seite zu schließen, zu navigieren oder neu zu laden, zeigt der Browser den Warnhinweis-Dialog an. Probieren Sie es aus:
Spezifikationen
Specification |
---|
HTML # event-beforeunload |
HTML # handler-window-onbeforeunload |
Browser-Kompatibilität
Siehe auch
BeforeUnloadEvent
-Schnittstelle- Verwandte Ereignisse:
- Page Lifecycle API bietet nützlichere Hinweise zum Umgang mit dem Seitenlebenszyklusverhalten in Ihren Webanwendungen.