Signatur
Beschreibung
Window.closed ist ein schreibgeschützter Wahrheitswert. Er gibt an, ob das Fenster, auf das eine Window-Referenz zeigt, geschlossen wurde. Typisch ist der Einsatz bei Pop-ups, die mit window.open() geöffnet wurden. Das öffnende Skript kann so prüfen, ob die Person das Fenster inzwischen geschlossen hat, etwa nach einem OAuth-Login, einem Zahlungsdialog oder einer Druckvorschau.
Die Eigenschaft liefert true, sobald das Fenster geschlossen wurde oder gerade geschlossen wird. Solange es offen ist, liefert sie false. Weil geschlossene Fenster in der Regel kein Ereignis an den Öffner schicken (beforeunload/unload sind bei fremden Ursprüngen nicht zugänglich), fragt man closed meist regelmäßig per setInterval() ab.
Auch bei Fenstern von einem anderen Ursprung lässt sich closed lesen. Es gehört zu den wenigen Eigenschaften, die über Ursprungsgrenzen hinweg erlaubt sind, genau wie postMessage() und close(). Deshalb eignet es sich gut, um Pop-ups externer Anbieter zu überwachen.
Rückgabewert
true, wenn das Fenster geschlossen ist oder gerade geschlossen wird, sonst false.Beispiele
Pop-up öffnen und Status prüfen
const popup = window.open('https://example.com', 'hilfe', 'width=500,height=600');
if (popup === null) {
console.log('Pop-up wurde blockiert');
} else {
console.log('Geschlossen?', popup.closed);
popup.close();
// Kurz warten, da das Schließen asynchron erfolgt
setTimeout(() => console.log('Geschlossen?', popup.closed), 100);
}
Login-Pop-up überwachen (Polling)
const warteAufSchliessen = (win, intervall = 500) =>
new Promise((resolve) => {
const timer = setInterval(() => {
if (win.closed) {
clearInterval(timer);
resolve();
}
}, intervall);
});
const loginStarten = async () => {
const popup = window.open('/oauth/start', 'login', 'width=480,height=640');
if (!popup) return console.warn('Pop-up blockiert');
await warteAufSchliessen(popup);
console.log('Login-Fenster geschlossen – Sitzung wird neu geladen');
// z. B. await fetch('/api/session') ...
};
document.querySelector('#login')?.addEventListener('click', loginStarten);
Vorhandenes Fenster wiederverwenden statt neu öffnen
let vorschau = null;
const zeigeVorschau = (url) => {
if (vorschau && !vorschau.closed) {
vorschau.location.href = url; // nur bei gleichem Ursprung erlaubt
vorschau.focus();
} else {
vorschau = window.open(url, 'vorschau', 'width=800,height=600');
}
};
zeigeVorschau('/vorschau?id=42');
Aus dem Pop-up heraus den Öffner prüfen
// Code im Pop-up-Fenster
if (window.opener && !window.opener.closed) {
window.opener.postMessage({ typ: 'fertig' }, window.location.origin);
window.close();
} else {
console.log('Ursprüngliches Fenster existiert nicht mehr');
}
// Wichtig · Fallstricke
- Pop-up-Blocker:
window.open()kannnullzurückgeben. Prüfe die Referenz daher vor dem Zugriff aufclosed, sonst gibt es einenTypeError. - Asynchrones Schließen: Direkt nach
win.close()kannclosedje nach Browser noch kurzfalseliefern. Verlass dich nicht auf einen sofortigen Wechsel. - COOP-Header: Setzt die geöffnete Seite
Cross-Origin-Opener-Policy: same-origin, wird die Verbindung zwischen den Fenstern getrennt. Das Pop-up läuft dann in einer eigenen Browsing-Context-Gruppe, undclosedmeldettrue, obwohl das Fenster noch offen ist. Mitnoopenergibtwindow.open()ohnehinnullzurück. - Performance: Frag beim Polling nicht in zu kurzen Abständen ab (250–1000 ms reichen). Beende das Intervall mit
clearInterval(), sobald das Fenster geschlossen ist. - Bei
window.closeddes eigenen Fensters ist der Wert praktisch immerfalse, solange Skripte laufen. Sinnvoll ist die Eigenschaft nur mit einer Referenz auf ein anderes Fenster. - Die Eigenschaft ist schreibgeschützt. Eine Zuweisung wird ignoriert und hat keine Wirkung.