Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.

View in English Always switch to English

Window: beforeunload Ereignis

Eingeschränkt verfügbar

Diese Funktion ist nicht Baseline, da sie in einigen der am weitesten verbreiteten Browser nicht funktioniert.

Want more browser support for this feature? Tell us why.

Das beforeunload Ereignis wird ausgelöst, wenn das aktuelle Fenster, das enthaltene Dokument und die damit verbundenen 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 besteht darin, einen vom Browser generierten Bestätigungsdialog auszulösen, der Benutzer fragt, ob sie wirklich die Seite verlassen möchten, wenn sie versuchen, sie zu schließen, neu zu laden oder anderswohin zu navigieren. Dies soll helfen, den Verlust von ungespeicherten 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 String-Wert oder einen anderen truthy Wert.
  • Durch Zurückgeben eines truthy Werts aus der Ereignis-Handler-Funktion, z. B. return "string". Beachten Sie, dass dies nur funktioniert, wenn die Funktion über die Eigenschaft onbeforeunload angehängt wird, nicht über die Methode addEventListener(). Dieses Verhalten ist konsistent über moderne Versionen von Firefox, Safari und Chrome.

Die letzten beiden Mechanismen sind veraltete Funktionen; beste Praxis ist es, den Dialog auszulösen, indem preventDefault() auf das Ereignisobjekt aufgerufen wird, während returnValue gesetzt wird, um ältere Fälle zu unterstützen.

Syntax

Verwenden Sie den Ereignisnamen in Methoden wie addEventListener() oder setzen Sie eine Ereignishandler-Eigenschaft.

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

onbeforeunload = (event) => { }

Ereignistyp

Ein BeforeUnloadEvent. Erbt von Event.

Verwendungshinweise

Um den Dialog anzuzeigen, wenn der Benutzer den Tab schließt oder navigiert, sollte eine beforeunload Ereignis-Handler-Funktion preventDefault() auf dem Ereignisobjekt aufrufen. Sie sollten beachten, dass moderne Implementierungen:

  • sticky activation für das Anzeigen des Dialogs erfordern. Das bedeutet, dass der Browser das Dialogfeld nur dann anzeigt, wenn der Frame oder ein eingebetteter Frame eine Benutzeraktion oder Benutzerinteraktion erhält. Wenn der Benutzer niemals mit der Seite interagiert hat, gibt es keine Benutzerdaten zu speichern, daher keinen legitimen Anwendungsfall für den Dialog.
  • Nur einen generischen, vom Browser spezifizierten String im angezeigten Dialog anzeigen. Dies kann nicht durch Webseiten-Code gesteuert werden.

Das beforeunload Ereignis hat einige Probleme:

  • 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 ein zuverlässigeres Signal für das automatische Speichern des App-Zustands zu verwenden, das Probleme wie die oben genannten umgeht. Weitere Details finden Sie unter Don't lose user and app state, use Page Visibility.

  • In Firefox ist beforeunload nicht kompatibel mit dem back/forward cache (bfcache): Das heißt, Firefox wird Seiten nicht im bfcache speichern, wenn sie beforeunload Listener haben, und dies ist schlecht für die Leistung.

Es wird daher empfohlen, dass Entwickler beforeunload nur dann überwachen, wenn Benutzer ungespeicherte Änderungen haben, sodass der oben erwähnte Dialog verwendet werden kann, um sie über drohenden Datenverlust zu warnen, und den Listener wieder entfernen, wenn er nicht benötigt wird. Das sparsame Überwachen von beforeunload kann den Einfluss auf die Leistung minimieren.

Ereignishandler-Aliasse

Zusätzlich zum Window Interface ist die Ereignishandler-Eigenschaft 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 werden könnten und das Speichern erfordern:

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

Unser JavaScript fügt einen input Ereignis-Listener zum <input> Element hinzu, der auf Änderungen im eingegebenen Wert hört. Wenn der Wert auf einen nicht-leeren Wert aktualisiert wird, wird ein beforeunload Ereignis-Listener zum Window Objekt hinzugefügt.

Wenn der Wert wieder zu einem leeren String wird (d.h. der Wert gelöscht wird), wird der beforeunload Ereignis-Listener wieder entfernt – wie in den Verwendungshinweisen erwähnt, sollte der Listener entfernt werden, wenn keine ungespeicherten Daten vorhanden sind, vor denen gewarnt werden könnte.

Die beforeunload Ereignis-Handler-Funktion 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 die Handler-Funktion aufgenommen, damit alle Browser, die den event.preventDefault() Mechanismus nicht unterstützen, die Demo dennoch korrekt ausführen.

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, zeigt der Browser beim Versuch, die Seite zu schließen, zu navigieren oder zu aktualisieren, den Warnungsdialog an. Probieren Sie es aus:

Spezifikationen

Spezifikation
HTML
# event-beforeunload
HTML
# handler-window-onbeforeunload

Browser-Kompatibilität

Siehe auch