HTMLSlotElement: slotchange 事件

Baseline 已广泛支持

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2020 年 1 月⁩ 起,所有主流浏览器均已支持。

<slot> 元素 (HTMLSlotElement 实例) 中包含的节点发生变化时,会在此元素上触发 slotchange 事件。

注意: 如果被插槽的节点内的子节点发生变化,slotchange 事件不会触发——只有在你更改(例如添加或删除)实际节点本身时才会触发。

为了触发 slotchange 事件,必须设置或移除 slot 属性。

此事件不可取消。

语法

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

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

onslotchange = (event) => { }

事件类型

一个通用的 Event

示例

js
element.setAttribute("slot", slotName);
// element.assignedSlot = $slot
element.removeAttribute("slot");
// element.assignedSlot = null

以下代码片段来自我们的 slotchange 示例也可在线查看)。

js
let slots = this.shadowRoot.querySelectorAll("slot");
slots[1].addEventListener("slotchange", (e) => {
  let nodes = slots[1].assignedNodes();
  console.log(
    `Element in Slot "${slots[1].name}" changed to "${nodes[0].outerHTML}".`,
  );
});

在这里,我们获取所有 <slot> 元素的引用,然后为模板的第二个插槽添加 slotchange 事件监听器——在示例中,这个插槽的内容会被更改。

每次插入到插槽中的元素发生变化时,我们都会向控制台记录一份报告,说明哪个插槽发生了变化,以及插槽内的新节点是什么。

规范

规范
DOM
# eventdef-htmlslotelement-slotchange
HTML
# handler-onslotchange

浏览器兼容性

另见

HTMLSlotElement