HTMLElement: событие beforetoggle
Событие beforetoggle интерфейса HTMLElement срабатывает на элементе поверхности или <dialog> непосредственно перед его отображением или скрытием.
- Если элемент переходит от скрытого состояния к отображаемому, свойство
event.oldStateбудет установлено в значениеclosed, а свойствоevent.newState— в значениеopen. - Если элемент переходит от отображаемого состояния к скрытому, то
event.oldStateбудетopen, аevent.newStateбудетclosed.
Это событие является отменяемым при переключении элемента в открытое состояние ("отображение"), но не при закрытии.
Это событие, среди прочего, может использоваться для:
- предотвращения отображения элемента.
- добавления или удаления классов или свойств от элемента или связанных элементов, например, для управления поведением анимации диалога при открытии и закрытии.
- очистки состояния элемента перед открытием или после скрытия, например, для сброса формы диалога и возвращения значения в пустое состояние или скрытия всех вложенных пользовательских всплывающих окон при повторном открытии всплывающего окна.
Синтаксис
Используйте имя события в методах, таких как addEventListener(), или установите свойство обработчика событий.
addEventListener("beforetoggle", (event) => {});
onbeforetoggle = (event) => {};
Тип события
Объект ToggleEvent. Наследуется от Event.
Примеры
Примеры ниже демонстрируют, как событие beforetoggle может использоваться для элемента поверхности или <dialog>. Те же примеры аналогичным образом будут работать и на других типах элементов.
Базовый пример
Этот пример демонстрирует, как прослушивать событие beforetoggle и выводить результат.
HTML
HTML состоит из поверхности и кнопки для ее открытия и закрытия.
<button popovertarget="mypopover">Toggle the popover</button> <div id="mypopover" popover>Popover content</div>
JavaScript
Код добавляет обработчик события beforetoggle и выводит состояние.
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");
}
});
Результат
Предотвращение открытия поверхности
Событие beforetoggle является отменяемым, если оно срабатывает при открытии элемента.
Ниже показано, как поверхность сначала проверяет, разрешено ли ее открытие, и если нет, вызывает Event.preventDefault(), чтобы отменить событие. В этом примере мы используем кнопку для установки возможности открытия поверхности; в более «полноценном» примере это может зависеть от состояния приложения или данных, готовых к отображению в поверхности.
HTML
HTML состоит из поверхности, кнопки для ее открытия и закрытия и кнопки для настройки возможности открытия.
<button popovertarget="mypopover">Toggle the popover</button> <button id="allow_button"></button> <div id="mypopover" popover>Popover content</div>
JavaScript
Сначала мы настроим код для моделирования состояния, в котором открытие поверхности не допускается. Это представлено переменной allowOpen, которая переключается при нажатии соответствующей кнопки.
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();
});
Код добавляет обработчик события beforetoggle . Если allowOpen имеет значение false, вызывается preventDefault(), что останавливает открытие всплывающего окна.
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");
}
});
Результат
Примечание о слиянии событий beforetoggle
Если несколько событий beforetoggle срабатывают до того, как цикл обработки событий успеет выполниться, будет сгенерировано только одно событие. Это называется «слиянием событий».
Например:
popover.addEventListener("beforetoggle", () => {
//...
});
popover.showPopover();
popover.hidePopover();
// `beforetoggle` only fires once
Другие примеры
-
Открытие модального диалога в примере
HTMLDialogElement
Спецификации
| Спецификация |
|---|
| HTML # event-beforetoggle |
Совместимость с браузерами
| Рабочие столы | Мобильные устройства | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari на iOS | Samsung Internet | WebView Android | |
beforetoggle_event |
114 | 114 | 125 | 100 | 17 | 114 | 125 | 76 | 17 | 23.0 | 114 |
dialog_elements |
132 | 132 | 133 | 117 | Нет | 132 | 133 | Нет | Нет | Нет | 132 |
popover_elements |
114 | 114 | 125 | 100 | 17 | 114 | 125 | 76 | 17 | 23.0 | 114 |
См. также
-
popoverглобальное атрибут HTML - API поверхности
- Соответствующее событие:
toggle
© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/beforetoggle_event