事件: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①

瀏覽器相容性