HTMLElement: beforetoggle 事件

Baseline 2024
新推出

自 ⁨2024 年 4 月⁩ 起,此功能可在最新的设备和浏览器版本中运行。此功能可能不适用于较旧的设备或浏览器。

HTMLElement 接口的 beforetoggle 事件在 popover<dialog> 元素即将显示或隐藏时触发。

  • 如果元素正从隐藏状态转为显示状态,则 event.oldState 属性将设置为 closed,而 event.newState 属性将设置为 open
  • 如果元素正从显示状态转为隐藏状态,则 event.oldState 将为 open,而 event.newState 将为 closed

当元素被切换为显示时,此事件是 可取消的,但当元素关闭时则不可取消。

除其他事项外,此事件可用于:

  • 阻止元素显示。
  • 向元素或相关元素添加或删除类或属性,例如控制对话框打开和关闭时的动画行为。
  • 在元素打开之前或隐藏之后清除元素的状态,例如重置对话框表单并将其返回值设为空状态,或在重新打开弹出窗口时隐藏任何嵌套的手动弹出窗口。

语法

在诸如 addEventListener() 之类的方法中使用事件名称,或设置事件处理程序属性。

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

onbeforetoggle = (event) => { }

事件类型

一个 ToggleEvent。继承自 Event

Event ToggleEvent

示例

下面的示例演示了 beforetoggle 事件如何用于 popover<dialog> 元素。对于其他元素类型,这些示例将以类似的方式工作。

基本示例

本示例展示了如何监听 beforetoggle 事件并记录结果。

HTML

HTML 包括一个 popover 和一个用于切换其显示和隐藏的按钮。

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

JavaScript

代码获取并添加了 beforetoggle 事件的事件监听器,并记录了状态。

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");
  }
});

结果

阻止 popover 打开

当元素被打开时,beforetoggle 事件是可取消的。

下面我们展示了一个 popover 如何首先检查是否允许其打开,如果不允许,则调用 Event.preventDefault() 来取消事件。在此示例中,我们使用一个按钮来设置 popover 是否可以打开:在一个更“功能齐全”的示例中,这可能取决于应用程序状态,或者 popover 中的数据是否已准备好显示。

HTML

HTML 包括一个 popover、一个用于切换其显示和隐藏的按钮,以及一个用于设置该按钮是否可以打开的按钮。

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

JavaScript

首先,我们设置代码以模拟一个不允许 popover 打开的状态。这由变量 allowOpen 表示,当关联的按钮被点击时,该变量会被切换。

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();
});

代码获取并添加了 beforetoggle 事件的事件监听器。如果 allowOpen 为 false,则调用 preventDefault(),这会阻止弹出窗口打开。

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");
  }
});

结果

关于 beforetoggle 事件合并的说明

如果在事件循环有机会循环之前触发了多个 beforetoggle 事件,则只会触发一个事件。这被称为“事件合并”。

例如

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

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

其他示例

规范

规范
HTML
# event-beforetoggle

浏览器兼容性

另见