Signatur
Beschreibung
Das Ereignis pagehide wird an das Window gesendet, wenn der Browser die aktuelle Seite nicht mehr anzeigt. Das passiert beim Wegnavigieren, beim Neuladen, beim Schließen des Tabs oder wenn der Browser die Seite in den Back/Forward-Cache (bfcache) verschiebt. Das Gegenstück ist pageshow.
Das Ereignisobjekt ist ein PageTransitionEvent. Seine Eigenschaft persisted zeigt an, ob die Seite im bfcache aufbewahrt wird (true) und später ohne Neuladen wiederhergestellt werden kann, oder ob sie verworfen wird (false).
Im Gegensatz zu unload und beforeunload verhindert ein pagehide-Listener nicht, dass die Seite in den bfcache kommt. Deshalb ist es neben visibilitychange der empfohlene Zeitpunkt, um zum Schluss noch aufzuräumen: Analysedaten per navigator.sendBeacon() senden, Zustand in localStorage speichern oder offene Verbindungen (WebSocket, IndexedDB) schließen.
Registrieren kannst du den Listener mit window.addEventListener("pagehide", handler) oder über die Eigenschaft window.onpagehide = handler. Das Ereignis lässt sich nicht abbrechen und steigt nicht im DOM auf (kein Bubbling).
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $type Pflicht | string | Name des Ereignisses: "pagehide". |
|
| $handler Pflicht | (event: PageTransitionEvent) => void | Callback-Funktion. Sie erhält ein PageTransitionEvent mit der booleschen Eigenschaft persisted. |
|
| $options | boolean | AddEventListenerOptions | false | Optionale Einstellungen wie { once: true } oder { capture: true }. |
Beispiele
Unterscheiden, ob die Seite im bfcache landet
window.addEventListener("pagehide", (event) => {
if (event.persisted) {
console.log("Seite wird im Back/Forward-Cache aufbewahrt.");
} else {
console.log("Seite wird verworfen.");
}
});
Analysedaten zuverlässig beim Verlassen senden
const sessionStart = performance.now();
window.addEventListener("pagehide", () => {
const payload = JSON.stringify({
page: location.pathname,
durationMs: Math.round(performance.now() - sessionStart)
});
// sendBeacon läuft auch weiter, wenn die Seite schon entladen ist
navigator.sendBeacon("/api/analytics", payload);
});
Formularentwurf sichern und beim Zurückkehren wiederherstellen
const textarea = document.querySelector("#entwurf");
window.onpagehide = () => {
localStorage.setItem("entwurf", textarea.value);
};
window.addEventListener("pageshow", (event) => {
if (!event.persisted) {
textarea.value = localStorage.getItem("entwurf") ?? "";
}
console.log("Wiederhergestellt aus bfcache:", event.persisted);
});
Verbindung schließen und Listener wieder entfernen
const socket = new WebSocket("wss://example.com/live");
const onPageHide = (event) => {
// Offene WebSockets können den bfcache blockieren
socket.close();
console.log("Socket geschlossen, persisted =", event.persisted);
};
window.addEventListener("pagehide", onPageHide);
// Später, z. B. wenn die Komponente entfernt wird:
window.removeEventListener("pagehide", onPageHide);
// Wichtig · Fallstricke
- Nimm
pagehidestattunload:unload-Listener verhindern in vielen Browsern den bfcache, und Chrome schafftunloadnach und nach ab.pagehidehat dieses Problem nicht. - Auf Mobilgeräten unzuverlässig: Wird ein Tab im Hintergrund vom Betriebssystem beendet, feuert
pagehideoft gar nicht. Für kritische Daten wie Analysewerte solltest du zusätzlich aufvisibilitychangemitdocument.visibilityState === \"hidden\"reagieren. - Keine asynchrone Arbeit:
fetch()ohnekeepalive: true, Promises oder Timer werden nach dem Ereignis unter Umständen nicht mehr ausgeführt. Nutzenavigator.sendBeacon()oderfetch(url, { keepalive: true }). - Kein Bestätigungsdialog:
pagehidekann die Navigation nicht aufhalten. Dafür istbeforeunloadzuständig. persistedist nur ein Hinweis: Auch beipersisted === truekann der Browser die Seite später aus dem Cache werfen. Räume Ressourcen deshalb in beiden Fällen auf.- Browser-Unterstützung: Alle modernen Browser unterstützen das Ereignis. Safari löst es in manchen Fällen schon beim Wechsel des Tabs aus.