Window: beforeunload-Ereignis

Das beforeunload-Ereignis wird ausgelöst, wenn das aktuelle Fenster, das darin 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 für dieses Ereignis ist das Auslösen eines browserspezifischen Bestätigungsdialogs, der die Benutzer fragt, ob sie wirklich die Seite verlassen möchten, wenn sie versuchen, sie zu schließen, neu zu laden oder woanders hinzunavigieren. Dies soll helfen, den Verlust nicht gespeicherter Daten zu verhindern.

Der Dialog kann auf folgende Weise ausgelöst werden:

  • Durch Aufrufen der Methode preventDefault() des Ereignisobjekts.
  • Durch Setzen der Eigenschaft returnValue des Ereignisobjekts auf einen nicht leeren Zeichenkettenwert oder einen anderen truthy-Wert.
  • Durch Rückgabe eines truthy-Werts aus der Ereignishandlerfunktion, z. B. return "string". Beachten Sie, dass dies nur funktioniert, wenn die Funktion über die onbeforeunload-Eigenschaft angehängt ist, nicht über die Methode addEventListener(). Dieses Verhalten ist in modernen Versionen von Firefox, Safari und Chrome konsistent.

Die letzten beiden Mechanismen sind veraltete Funktionen; die beste Methode ist es, den Dialog durch Aufruf von preventDefault() am Ereignisobjekt auszulösen, während auch returnValue gesetzt wird, um ältere Fälle zu unterstützen.

Syntax

Verwenden Sie den Ereignisnamen in Methoden wie addEventListener(), oder setzen Sie eine Ereignishandlereigenschaft.

js
addEventListener("beforeunload", (event) => {});
onbeforeunload = (event) => {};

Ereignistyp

Ein BeforeUnloadEvent. Erbt von Event.

Hinweise zur Verwendung

Um den Dialog anzuzeigen, wenn der Benutzer den Tab schließt oder navigiert, sollte eine beforeunload-Ereignishandlerfunktion preventDefault() am Ereignisobjekt aufrufen. Beachten Sie, dass moderne Implementierungen:

  • Sticky-Aktivierung erfordern, damit der Dialog angezeigt wird. Mit anderen Worten: Der Browser zeigt das Dialogfeld nur an, wenn der Frame oder ein eingebetteter Frame eine Benutzeraktion oder Benutzerinteraktion erhält. Wenn der Benutzer nie mit der Seite interagiert hat, gibt es keine zu speichernden Benutzerdaten und somit keinen legitimen Anwendungsfall für den Dialog.
  • Nur eine generische, vom Browser angegebene Zeichenfolge im angezeigten Dialog zeigen. Dies kann nicht durch den Webseiten-Code gesteuert werden.

Das beforeunload-Ereignis weist einige Probleme auf:

  • Es wird nicht zuverlässig ausgelöst, insbesondere auf mobilen Plattformen. Zum Beispiel wird das beforeunload-Ereignis in folgendem Szenario überhaupt nicht ausgelöst:

    1. Ein mobiler Benutzer besucht Ihre Seite.

    2. Der Benutzer wechselt dann zu einer anderen App.

    3. Später schließt der Benutzer den Browser über den App-Manager.

    Hinweis: Es wird empfohlen, das visibilitychange-Ereignis als zuverlässigeren Hinweis für das automatische Speichern des App-Zustands zu verwenden, um Probleme wie das oben genannte zu umgehen. 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 keine Seiten im bfcache, wenn sie beforeunload-Listener haben, und dies ist schlecht für die Leistung.

Es wird daher empfohlen, dass Entwickler nur dann auf beforeunload hören, wenn Benutzer nicht gespeicherte Änderungen haben, sodass der oben erwähnte Dialog verwendet werden kann, um auf drohenden Datenverlust hinzuweisen, und den Listener wieder entfernen, wenn er nicht benötigt wird. Das sparsame Lauschen auf beforeunload kann die Auswirkungen auf die Leistung minimieren.

Ereignishandler-Aliase

Zusätzlich zur Window-Schnittstelle ist die Ereignishandlereigenschaft onbeforeunload auch auf den folgenden Zielen verfügbar:

Beispiele

Im folgenden Beispiel haben wir ein HTML-Text-<input>, um einige Daten darzustellen, die geändert und gespeichert werden könnten:

html
<form>
  <input type="text" name="name" id="name" />
</form>

Unser JavaScript hängt einen input-Ereignislistener an das <input>-Element an, der auf Änderungen des eingegebenen Wertes hört. Wenn der Wert auf einen nicht leeren Wert aktualisiert wird, wird ein beforeunload-Ereignislistener an das Window-Objekt angehängt.

Wenn der Wert wieder eine leere Zeichenkette wird (d. h. der Wert gelöscht wird), wird der beforeunload-Ereignislistener wieder entfernt — wie oben in den Hinweisen zur Verwendung erwähnt, sollte der Listener entfernt werden, wenn es keine nicht gespeicherten Daten gibt, um darauf hinzuweisen.

Die beforeunload-Ereignishandlerfunktion ruft event.preventDefault() auf, um den Warnungsdialog auszulösen, wenn der Benutzer den Tab schließt oder navigiert. Wir haben auch event.returnValue = true in der Handlerfunktion aufgenommen, damit der Demo auch auf Browsern, die den event.preventDefault()-Mechanismus nicht unterstützen, korrekt ausgeführt wird.

js
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 Warnungsdialog an. Probieren Sie es aus:

Spezifikationen

Specification
HTML Standard
# event-beforeunload
HTML Standard
# handler-window-onbeforeunload

Browser-Kompatibilität

BCD tables only load in the browser

Siehe auch