HTMLDetailsElement:toggle 事件

<details> 元素的 open/closed 状态切换时,将触发 toggle 事件。

此事件不可取消,也不会冒泡。

注意:toggle 事件在 HTMLElement 上也以不同的形式提供;此版本在 弹出窗口元素 显示或隐藏后立即触发。有关更多信息,请参阅 HTMLElement toggle 事件页面。

语法

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

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

ontoggle = (event) => {};
html
<details ontoggle="console.log(this.open)" open>...</details>

注意:在上面的示例中,由于设置了 open 属性,因此事件监听器将在没有任何用户交互的情况下被调用一次。不建议使用这种 事件处理程序属性

事件类型

示例

此示例记录打开的章节。当章节关闭时,它们将从日志中删除。

HTML

html
<aside id="log">
  <p>Open chapters:</p>
  <div data-id="ch1" hidden>I</div>
  <div data-id="ch2" hidden>II</div>
  <div data-id="ch3" hidden>III</div>
</aside>
<section id="summaries">
  <p>Chapter summaries:</p>
  <details id="ch1">
    <summary>Chapter I</summary>
    Philosophy reproves Boethius for the foolishness of his complaints against
    Fortune. Her very nature is caprice.
  </details>
  <details id="ch2">
    <summary>Chapter II</summary>
    Philosophy in Fortune's name replies to Boethius' reproaches, and proves
    that the gifts of Fortune are hers to give and to take away.
  </details>
  <details id="ch3">
    <summary>Chapter III</summary>
    Boethius falls back upon his present sense of misery. Philosophy reminds him
    of the brilliancy of his former fortunes.
  </details>
</section>

CSS

css
body {
  display: flex;
  flex-direction: row-reverse;
}

#log {
  flex-shrink: 0;
  padding-left: 3em;
}

#summaries {
  flex-grow: 1;
}

JavaScript

js
function logItem(e) {
  const item = document.querySelector(`[data-id=${e.target.id}]`);
  item.toggleAttribute("hidden");
}

const chapters = document.querySelectorAll("details");
chapters.forEach((chapter) => {
  chapter.addEventListener("toggle", logItem);
});

结果

规范

规范
HTML 标准
# event-toggle

浏览器兼容性

BCD 表格仅在启用 JavaScript 的浏览器中加载。