CloseWatcher
Limited availability
This feature is not Baseline because it does not work in some of the most widely-used browsers.
Experimentell: Dies ist eine experimentelle Technologie
Überprüfen Sie die Browser-Kompatibilitätstabelle sorgfältig, bevor Sie diese produktiv verwenden.
Das CloseWatcher
-Interface ermöglicht es einer benutzerdefinierten UI-Komponente mit Öffnen- und Schließen-Semantik, auf gerätespezifische Schließaktionen genauso zu reagieren wie eine integrierte Komponente.
Das CloseWatcher
-Interface erbt von EventTarget
.
Konstruktor
CloseWatcher()
Experimentell-
Erstellt eine neue
CloseWatcher
-Instanz.
Instanzmethoden
Dieses Interface erbt auch Methoden von seinem Elternteil, EventTarget
.
CloseWatcher.requestClose()
Experimentell-
Löst ein
cancel
-Ereignis aus und, wenn dieses nicht mitEvent.preventDefault()
abgebrochen wird, fährt fort, einclose
-Ereignis auszulösen und deaktiviert schließlich den CloseWatcher, als obdestroy()
aufgerufen wurde. CloseWatcher.close()
Experimentell-
Löst sofort das
close
-Ereignis aus, ohne vorhercancel
auszulösen, und deaktiviert den CloseWatcher, als obdestroy()
aufgerufen wurde. CloseWatcher.destroy()
Experimentell-
Deaktiviert den CloseWatcher, sodass er keine
close
-Ereignisse mehr empfängt.
Ereignisse
Beschreibung
Einige UI-Komponenten haben ein "Schließverhalten", was bedeutet, dass die Komponente erscheint und der Benutzer sie schließen kann, wenn er fertig ist. Zum Beispiel: Seitenleisten, Popups, Dialoge oder Benachrichtigungen.
Benutzer erwarten im Allgemeinen, dass sie einen bestimmten Mechanismus verwenden können, um diese Elemente zu schließen, und der Mechanismus tendiert dazu, gerätespezifisch zu sein. Zum Beispiel könnte es auf einem Gerät mit Tastatur die Esc-Taste sein, aber Android könnte die Zurück-Taste verwenden. Bei integrierten Komponenten, wie popover oder <dialog>
-Elementen, kümmert sich der Browser um diese Unterschiede und schließt das Element, wenn der Benutzer die für das Gerät geeignete Schließaktion ausführt. Wenn ein Webentwickler jedoch seine eigene schließbare UI-Komponente (zum Beispiel eine Seitenleiste) implementiert, ist es schwierig, dieses gerätespezifische Schließverhalten zu implementieren.
Das CloseWatcher
-Interface löst dieses Problem, indem es ein cancel
-Ereignis, gefolgt von einem close
-Ereignis, liefert, wenn der Benutzer die gerätespezifische Schließaktion ausführt. Webanwendungen können den onclose
-Handler verwenden, um das UI-Element als Reaktion auf das gerätespezifische Ereignis zu schließen. Sie können auch dieselben Ereignisse als Reaktion auf den normalen Schließmechanismus des UI-Elements auslösen und dann eine gemeinsame close
-Ereignisbehandlung sowohl für die anwendungs- als auch gerätespezifische Schließaktion implementieren. Sobald der onclose
-Ereignishandler abgeschlossen ist, wird der CloseWatcher
zerstört und die Ereignisse werden nicht mehr ausgelöst.
In einigen Anwendungen darf das UI-Element möglicherweise nur dann geschlossen werden, wenn es sich in einem bestimmten Zustand befindet; zum Beispiel, wenn einige benötigte Informationen eingetragen sind. Um diese Fälle zu adressieren, können Anwendungen verhindern, dass das close
-Ereignis gesendet wird, indem sie einen Handler für das cancel
-Ereignis implementieren, der Event.preventDefault()
aufruft, wenn das UI-Element nicht bereit ist, geschlossen zu werden.
Sie können CloseWatcher
-Instanzen ohne Benutzeraktivierung erstellen, was nützlich sein kann, um Fälle wie Dialoge bei Inaktivitäts-Timeouts der Sitzung zu implementieren. Wenn Sie jedoch mehr als einen CloseWatcher
ohne Benutzeraktivierung erstellen, werden die Watcher gruppiert, sodass eine einzelne Schließanforderung beide schließt. Zudem muss der erste CloseWatcher nicht unbedingt ein CloseWatcher
-Objekt sein: Er kann auch ein modales Dialogelement oder ein Popover sein, das von einem Element mit dem Popover-Attribut generiert wurde.
Beispiele
Verarbeitung von Schließanforderungen
In diesem Beispiel haben Sie Ihre eigene UI-Komponente (einen Picker) und Sie möchten sowohl die standardmäßige Schließmethode der Plattform (z.B. die Esc-Taste) als auch Ihre benutzerdefinierte Schließmethode (eine Schaltfläche zum Schließen) unterstützen.
Sie erstellen einen CloseWatcher
, um alle close
-Ereignisse zu bearbeiten.
Der onclick
-Handler Ihrer UI-Komponente kann requestClose
aufrufen, um ein Schließen anzufordern und Ihre Schließanforderung durch denselben onclose
-Handler zu leiten, den die Plattform-Schließmethode verwendet.
const watcher = new CloseWatcher();
const picker = setUpAndShowPickerDOMElement();
let chosenValue = null;
watcher.onclose = () => {
chosenValue = picker.querySelector("input").value;
picker.remove();
};
picker.querySelector(".close-button").onclick = () => watcher.requestClose();
Schließen einer Seitenleiste mit einer Schließanforderung der Plattform
In diesem Beispiel haben wir eine Seitenleisten-Komponente, die angezeigt wird, wenn eine "Öffnen"-Schaltfläche ausgewählt wird, und die über eine "Schließen"-Schaltfläche oder plattformnative Mechanismen ausgeblendet wird. Um es interessanter zu machen, ist dies ein Live-Beispiel!
Beachten Sie auch, dass das Beispiel ein wenig konstruiert ist, da wir normalerweise eine Umschaltfläche verwenden würden, um einen Seitenleistenstatus zu ändern. Wir könnten das sicherlich tun, aber die Verwendung getrennter "Öffnen"- und "Schließen"-Schaltflächen erleichtert die Demonstration der Funktion.
HTML
Das HTML definiert "Öffnen"- und "Schließen"-<button>
-Elemente, zusammen mit <div>
-Elementen für den Hauptinhalt und die Seitenleiste. CSS wird verwendet, um die Anzeige des Sidebar-Elements zu animieren, wenn die open
-Klasse den Sidebar- und Inhaltselementen hinzugefügt oder entfernt wird (dieses CSS wird ausgeblendet, da es für das Beispiel nicht relevant ist).
<button id="sidebar-open" type="button">Open</button>
<button id="sidebar-close" type="button">Close</button>
<div class="sidebar">Sidebar</div>
<div class="main-content">Main content</div>
JavaScript
Der Code ermittelt zuerst die Variablen für die in HTML definierten Schaltflächen und <div>
-Elemente. Er definiert auch eine Funktion closeSidebar()
, die aufgerufen wird, wenn die Seitenleiste geschlossen wird, um die open
-Klasse von den <div>
-Elementen zu entfernen, und fügt einen click
-Eventlistener hinzu, der die openSidebar()
-Methode aufruft, wenn die "Öffnen"-Schaltfläche geklickt wird.
const sidebar = document.querySelector(".sidebar");
const mainContent = document.querySelector(".main-content");
const sidebarOpen = document.getElementById("sidebar-open");
const sidebarClose = document.getElementById("sidebar-close");
function closeSidebar() {
sidebar.classList.remove("open");
mainContent.classList.remove("open");
}
sidebarOpen.addEventListener("click", openSidebar);
Die Implementierung von openSidebar()
ist unten angegeben. Die Methode überprüft zuerst, ob die Seitenleiste bereits geöffnet ist, und wenn nicht, wird die open
-Klasse den Elementen hinzugefügt, damit die Seitenleiste angezeigt wird.
Wir erstellen dann einen neuen CloseWatcher
und fügen einen Listener hinzu, der close()
darauf aufruft, wenn die "Schließen"-Schaltfläche geklickt wird. Dies stellt sicher, dass das close
-Ereignis aufgerufen wird, wenn entweder plattformnative Schließmethoden oder die "Schließen"-Schaltfläche verwendet werden. Die Implementierung des onclose()
-Ereignishandlers schließt einfach die Seitenleiste, und der CloseWatcher
wird dann automatisch zerstört.
function openSidebar() {
if (!sidebar.classList.contains("open")) {
sidebar.classList.add("open");
mainContent.classList.add("open");
//Add new CloseWatcher
const watcher = new CloseWatcher();
sidebarClose.addEventListener("click", () => watcher.close());
// Handle close event, invoked by platform mechanisms or "Close" button
watcher.onclose = () => {
closeSidebar();
};
}
}
Beachten Sie, dass wir uns entschieden haben, close()
beim Watcher anstelle von CloseWatcher.requestClose()
aufzurufen, weil wir nicht möchten, dass das cancel
-Ereignis ausgelöst wird (wir würden requestClose()
und den cancel
-Ereignishandler verwenden, wenn es einen Grund gäbe, ein vorzeitiges Schließen der Seitenleiste je zu verhindern).
Ergebnis
Wählen Sie die "Öffnen"-Schaltfläche, um die Seitenleiste zu öffnen. Sie sollten die Seitenleiste mit der "Schließen"-Schaltfläche oder der üblichen Plattformmethode, wie etwa der Esc-Taste unter Windows, schließen können.
Spezifikationen
Specification |
---|
HTML Standard # closewatcher |
Browser-Kompatibilität
BCD tables only load in the browser
Siehe auch
close
-Ereignis aufHTMLDialogElement