HTMLElement: beforetoggle event
The beforetoggle
event of the HTMLElement
interface fires on a popover or <dialog>
element just before it is shown or hidden.
- If the element is transitioning from hidden to showing, the
event.oldState
property will be set toclosed
and theevent.newState
property will be set toopen
. - If the element is transitioning from showing to hidden, then
event.oldState
will beopen
andevent.newState
will beclosed
.
This event is cancelable when an element is toggled to open ("show") but not when the element is closing.
Among other things, this event can be used to:
- prevent an element from being shown.
- add or remove classes or properties from the element or associated elements, for example to control the animation behaviour of a dialog as it is opened and closed.
- clear the state of the element before before it is opened or after it is hidden, for example to reset a dialog form and return value to an empty state, or hide any nested manual popovers when reopening a popup.
Syntax
Use the event name in methods like addEventListener()
, or set an event handler property.
addEventListener("beforetoggle", (event) => {});
onbeforetoggle = (event) => {};
Event type
A ToggleEvent
. Inherits from Event
.
Examples
Basic example
This example shows how to listen for the beforetoggle
event and log the result.
HTML
The HTML consists of a popover and a button for toggling it open and closed.
<button popovertarget="mypopover">Toggle the popover</button>
<div id="mypopover" popover>Popover content</div>
JavaScript
The code gets adds an event listener for the beforetoggle
event and logs the state.
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");
}
});
Result
Prevent a popover opening
The beforetoggle
event is cancelable if fired when opening an element.
Below we show how a popover that might first check if it is allowed to open, and if not, call Event.preventDefault()
to cancel the event.
In this example we use a button to set whether the popover can open or not: in a more "full featured" example this might depend on the application state, or the data in the popover being ready to display.
HTML
The HTML consists of a popover, a button for toggling it open and closed, and a button for setting whether the button can be opened.
<button popovertarget="mypopover">Toggle the popover</button>
<button id="allow_button"></button>
<div id="mypopover" popover>Popover content</div>
JavaScript
First we set up the code to simulate a state where we don't want to allow the popover to open.
This is represented by the variable allowOpen
, which is toggled when the associated button is clicked.
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();
});
The code gets adds an event listener for the beforetoggle
event.
If allowOpen
is false then preventDefault()
is called, which stops the popup from opening.
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");
}
});
Result
A note on beforetoggle event coalescing
If multiple beforetoggle
events are fired before the event loop has a chance to cycle, only a single event will be fired.
This is referred to as "event coalescing".
For example:
popover.addEventListener("beforetoggle", () => {
//...
});
popover.showPopover();
popover.hidePopover();
// `beforetoggle` only fires once
Other examples
- Opening a modal dialog example in
HTMLDialogElement
Specifications
Specification |
---|
HTML Standard # event-beforetoggle |
Browser compatibility
BCD tables only load in the browser
See also
popover
HTML global attribute- Popover API
- Related event:
toggle