Start · Sprachen · JavaScript · Referenz · Window.closed

Window.closed

Eigenschaft

Die schreibgeschützte Eigenschaft <code>Window.closed</code> gibt an, ob das referenzierte Fenster geschlossen wurde (<code>true</code>) oder noch offen ist (<code>false</code>).

seit JavaScript Baseline: alle Browser Kategorie: webapi

Signatur

Window.closed

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

Typ
boolean
Beschreibung
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);
}
Geschlossen? false Geschlossen? true

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);
Login-Fenster geschlossen – Sitzung wird neu geladen

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() kann null zurückgeben. Prüfe die Referenz daher vor dem Zugriff auf closed, sonst gibt es einen TypeError.
  • Asynchrones Schließen: Direkt nach win.close() kann closed je nach Browser noch kurz false liefern. 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, und closed meldet true, obwohl das Fenster noch offen ist. Mit noopener gibt window.open() ohnehin null zurü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.closed des eigenen Fensters ist der Wert praktisch immer false, 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.