Signatur
Beschreibung
Mit requestClose() wird ein CloseWatcher genauso geschlossen, als hätte die Person eine Schließ-Anfrage des Systems ausgelöst, etwa die Esc-Taste oder die Zurück-Geste bzw. -Taste auf Android. Zuerst wird ein cancel-Ereignis ausgelöst. Ruft ein Handler darin event.preventDefault() auf, bricht der Vorgang ab und der Watcher bleibt aktiv. Andernfalls folgt das close-Ereignis, und der Watcher wird dauerhaft deaktiviert (wie bei destroy()).
Die Methode eignet sich besonders für eigene „Schließen“-Schaltflächen in Dialogen, Seitenleisten oder Popovern. So läuft das Schließen über die Oberfläche durch dieselbe Logik wie das Schließen über die Systemgeste, zum Beispiel eine Rückfrage „Ungespeicherte Änderungen verwerfen?“ im cancel-Handler.
Der Unterschied zu close(): close() überspringt das cancel-Ereignis und löst sofort close aus. destroy() deaktiviert den Watcher ganz ohne Ereignisse. Wird requestClose() per Skript aufgerufen, ist das cancel-Ereignis immer abbrechbar (event.cancelable === true). Bei Systemgesten gilt das nur, wenn vorher eine Benutzeraktivierung stattgefunden hat.
Rückgabewert
cancel und close mitgeteilt.Beispiele
Eigener Schließen-Button für ein Seitenmenü
const panel = document.querySelector('#sidebar');
const closeBtn = document.querySelector('#sidebar-close');
const openSidebar = () => {
panel.hidden = false;
const watcher = new CloseWatcher();
watcher.addEventListener('close', () => {
panel.hidden = true;
console.log('Seitenleiste geschlossen');
});
// Button und Esc/Zurück-Geste laufen über denselben Weg
closeBtn.onclick = () => watcher.requestClose();
};
document.querySelector('#menu-btn').addEventListener('click', openSidebar);
Schließen bei ungespeicherten Änderungen verhindern
const form = document.querySelector('#edit-form');
let dirty = false;
form.addEventListener('input', () => { dirty = true; });
const watcher = new CloseWatcher();
watcher.oncancel = (event) => {
if (dirty && !confirm('Änderungen verwerfen?')) {
event.preventDefault(); // Watcher bleibt aktiv
console.log('Schließen abgebrochen');
}
};
watcher.onclose = () => {
form.closest('.modal').remove();
console.log('Modal entfernt');
};
document.querySelector('#cancel-btn')
.addEventListener('click', () => watcher.requestClose());
requestClose() vs. close() mit Feature-Erkennung
if ('CloseWatcher' in window) {
const w1 = new CloseWatcher();
w1.oncancel = () => console.log('w1: cancel');
w1.onclose = () => console.log('w1: close');
w1.requestClose(); // cancel -> close
const w2 = new CloseWatcher();
w2.oncancel = () => console.log('w2: cancel');
w2.onclose = () => console.log('w2: close');
w2.close(); // nur close
w1.requestClose(); // bereits deaktiviert: keine Ausgabe
} else {
console.log('CloseWatcher nicht unterstützt – Fallback auf keydown Escape');
}
// Wichtig · Fallstricke
- Browser-Unterstützung: Bisher nur in Chromium-basierten Browsern (ab Version 126). Vorher immer mit
'CloseWatcher' in windowprüfen und notfalls aufkeydownmitEscapezurückgreifen. - Nach einem erfolgreichen Schließen ist der Watcher dauerhaft deaktiviert. Weitere Aufrufe von
requestClose()bewirken nichts. Für ein erneutes Öffnen muss ein neuerCloseWatchererzeugt werden. - Wer
preventDefault()imcancel-Handler aufruft, sollte der Person eine klare Rückmeldung geben. Sonst wirkt die Schließen-Schaltfläche kaputt. - Über die Option
signalim Konstruktor (new CloseWatcher({ signal })) lässt sich der Watcher perAbortControllerzerstören. Danach wirktrequestClose()ebenfalls nicht mehr. - Native
<dialog>-Elemente und daspopover-Attribut bringen dieses Verhalten schon mit.CloseWatcherlohnt sich vor allem für eigene UI-Komponenten.