HTMLElement: beforetoggle Event

Das beforetoggle Ereignis der HTMLElement-Schnittstelle tritt bei einem Popover oder einem <dialog>-Element auf, unmittelbar bevor es angezeigt oder ausgeblendet wird.

  • Wenn das Element von verborgen zu sichtbar wechselt, wird die Eigenschaft event.oldState auf closed und die Eigenschaft event.newState auf open gesetzt.
  • Wenn das Element von sichtbar zu verborgen wechselt, dann ist event.oldState open und event.newState closed.

Dieses Ereignis ist abbrechbar, wenn ein Element geöffnet ("show") wird, jedoch nicht, wenn das Element geschlossen wird.

Dieses Ereignis kann unter anderem verwendet werden, um:

  • zu verhindern, dass ein Element angezeigt wird.
  • Klassen oder Eigenschaften von dem Element oder assoziierten Elementen hinzuzufügen oder zu entfernen, um beispielsweise das Animationsverhalten eines Dialogs beim Öffnen und Schließen zu steuern.
  • den Zustand des Elements zu löschen, bevor es geöffnet wird oder nachdem es ausgeblendet wurde, um zum Beispiel ein Dialogformular zurückzusetzen und den Rückgabewert auf einen leeren Zustand zu setzen oder verschachtelte manuelle Popovers beim erneuten Öffnen eines Popups auszublenden.

Syntax

Verwenden Sie den Ereignisnamen in Methoden wie addEventListener() oder setzen Sie eine Ereignishandler-Eigenschaft.

js
addEventListener("beforetoggle", (event) => {});

onbeforetoggle = (event) => {};

Ereignistyp

Beispiele

Die nachstehenden Beispiele zeigen, wie das beforetoggle-Ereignis für ein Popover oder ein <dialog>-Element verwendet werden könnte. Dieselben Beispiele würden ähnlich auf anderen Elementtypen funktionieren.

Einfaches Beispiel

Dieses Beispiel zeigt, wie das beforetoggle-Ereignis abgehört und das Ergebnis protokolliert wird.

HTML

Das HTML besteht aus einem Popover und einem Button zum Umschalten zwischen geöffnet und geschlossen.

html
<button popovertarget="mypopover">Toggle the popover</button>
<div id="mypopover" popover>Popover content</div>

JavaScript

Der Code fügt einen Ereignis-Listener für das beforetoggle-Ereignis hinzu und protokolliert den Zustand.

js
const popover = document.getElementById("mypopover");

popover.addEventListener("beforetoggle", (event) => {
  if (event.newState === "open") {
    log("Popover is about to be shown");
  } else {
    log("Popover is about to be hidden");
  }
});

Ergebnis

Öffnen eines Popovers verhindern

Das beforetoggle-Ereignis ist abbrechbar, wenn es beim Öffnen eines Elements ausgelöst wird.

Unten zeigen wir, wie ein Popover zuerst prüfen könnte, ob es sich öffnen darf, und falls nicht, Event.preventDefault() aufrufen, um das Ereignis abzubrechen. In diesem Beispiel verwenden wir einen Button, um festzulegen, ob der Popover geöffnet werden kann oder nicht: In einem umfassenderen Beispiel könnte dies vom Anwendungszustand oder den anzuzeigenden Daten im Popover abhängen.

HTML

Das HTML besteht aus einem Popover, einem Button zum Umschalten zwischen geöffnet und geschlossen, und einem Button zum Festlegen, ob der Button geöffnet werden kann.

html
<button popovertarget="mypopover">Toggle the popover</button>
<button id="allow_button"></button>
<div id="mypopover" popover>Popover content</div>

JavaScript

Zunächst richten wir den Code ein, um einen Zustand zu simulieren, in dem wir nicht möchten, dass sich der Popover öffnet. Dies wird durch die Variable allowOpen dargestellt, die beim Klicken auf den zugehörigen Button umgeschaltet wird.

js
const allowButton = document.getElementById("allow_button");

let allowOpen = true;

function toggleState() {
  allowOpen = !allowOpen;
  allowButton.innerText = allowOpen ? "Open Allowed" : "Open Prevented";
}

toggleState();

allowButton.addEventListener("click", (event) => {
  toggleState();
});

Der Code fügt einen Ereignis-Listener für das beforetoggle-Ereignis hinzu. Wenn allowOpen falsch ist, wird preventDefault() aufgerufen, wodurch das Öffnen des Popups verhindert wird.

js
const popover = document.getElementById("mypopover");

popover.addEventListener("beforetoggle", (event) => {
  if (event.newState === "open") {
    if (allowOpen) {
      log("Popover is about to be shown");
    } else {
      log("Popover opening prevented");
      event.preventDefault();
    }
  } else {
    log("Popover is about to be hidden");
  }
});

Ergebnis

Eine Anmerkung zur Coalescence von beforetoggle-Ereignissen

Wenn mehrere beforetoggle-Ereignisse ausgelöst werden, bevor die Ereignisschleife die Chance hat zu durchlaufen, wird nur ein einziges Ereignis ausgelöst. Dies wird als "Ereignis-Koaleszenz" bezeichnet.

Zum Beispiel:

js
popover.addEventListener("beforetoggle", () => {
  //...
});

popover.showPopover();
popover.hidePopover();
// `beforetoggle` only fires once

Weitere Beispiele

Spezifikationen

Specification
HTML Standard
# event-beforetoggle

Browser-Kompatibilität

BCD tables only load in the browser

Siehe auch