事件:composedPath() 方法

Baseline 已广泛支持

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

注意:此功能在 Web Workers 中可用。

Event 接口的 composedPath() 方法返回事件的路径,该路径是一个将调用监听器的对象的数组。如果 ShadowRoot 是以其 ShadowRoot.mode 属性设置为 closed 创建的,则此路径不包含 shadow tree 中的节点。

语法

js
composedPath()

参数

无。

返回值

一个代表将调用事件监听器的对象的 EventTarget 对象的数组。

示例

在下面的示例中,您可以在 https://mdn.github.io/web-components-examples/composed-composed-path/ 处进行尝试。我们定义了两个简单的自定义元素,<open-shadow><closed-shadow>,它们都将它们的 text 属性的内容插入到元素的 shadow DOM 中,作为 <p> 元素的文本内容。两者之间的唯一区别是,它们的 shadow root 是分别以 openclosed 模式附加的。

js
customElements.define(
  "open-shadow",
  class extends HTMLElement {
    constructor() {
      super();

      const pElem = document.createElement("p");
      pElem.textContent = this.getAttribute("text");

      const shadowRoot = this.attachShadow({ mode: "open" });
      shadowRoot.appendChild(pElem);
    }
  },
);

customElements.define(
  "closed-shadow",
  class extends HTMLElement {
    constructor() {
      super();

      const pElem = document.createElement("p");
      pElem.textContent = this.getAttribute("text");

      const shadowRoot = this.attachShadow({ mode: "closed" });
      shadowRoot.appendChild(pElem);
    }
  },
);

然后,我们在页面中插入了这两种元素各一个。

html
<open-shadow text="I have an open shadow root"></open-shadow>
<closed-shadow text="I have a closed shadow root"></closed-shadow>

接着,在 <html> 元素上包含一个点击事件监听器。

js
document.querySelector("html").addEventListener("click", (e) => {
  console.log(e.composed);
  console.log(e.composedPath());
});

当您分别点击 <open-shadow> 元素和 <closed-shadow> 元素时,您会注意到两点。首先,composed 属性返回 true,因为 click 事件总是能够跨越 shadow 边界传播。其次,您会注意到这两种元素 composedPath 的值存在差异。<open-shadow> 元素的 composed path 是这样的:

Array [ p, ShadowRoot, open-shadow, body, html, HTMLDocument https://mdn.github.io/web-components-examples/composed-composed-path/, Window ]

<closed-shadow> 元素的 composed path 如下:

Array [ closed-shadow, body, html, HTMLDocument https://mdn.github.io/web-components-examples/composed-composed-path/, Window ]

在第二种情况下,事件监听器只传播到 <closed-shadow> 元素本身,而不会传播到 shadow 边界内的节点。

规范

规范
DOM
# ref-for-dom-event-composedpath①

浏览器兼容性