事件:composed 屬性

Baseline 已廣泛支援

此特性已相當成熟,可在許多裝置和瀏覽器版本上使用。自 ⁨2020 年 1 月⁩ 起,所有主流瀏覽器均已支援。

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

Event 介面中的只讀 composed 屬性返回一個布林值,該值指示事件是否會穿過 Shadow DOM 邊界傳播到標準 DOM。

所有使用者代理(UA)分派的 UI 事件都是 composed 的(例如 click/touch/mouseover/copy/paste 等)。大多數其他型別的事件不是 composed 的,因此會返回 false。例如,這包括那些在建立時沒有將其 composed 選項設定為 true 的合成事件。

僅當 bubbles 屬性也為 true 時,事件才會傳播。但是,只有 composed 事件在捕獲階段也會被當作處於 AT_TARGET 階段進行處理。您可以透過呼叫 composedPath() 來確定事件將透過 Shadow Root 傳播到 DOM Root 的路徑。

如果事件在到達 Shadow Root 後會從 Shadow DOM 穿過到標準 DOM,則此布林值為 true。(即,事件開始傳播的 Shadow DOM 中的第一個節點。)

如果此值為 false,則 Shadow Root 將是接收事件的最後一個節點。

示例

在這個 示例 中,我們定義了兩個簡單的自定義元素:<open-shadow><closed-shadow>。它們都接受其 text 屬性的內容,並將其作為 <p> 元素的文字內容插入到元素的 Shadow DOM 中。兩者唯一的區別在於它們的 Shadow Root 在附加時,其 mode 分別設定為 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> 元素上添加了一個 click 事件監聽器。

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

當您單擊 <open-shadow> 元素,然後單擊 <closed-shadow> 元素時,您會注意到兩件事情。

  1. composed 屬性返回 true,因為 click 事件始終能夠穿過 Shadow 邊界傳播。
  2. composedPath 對兩個元素的值有所不同。

<open-shadow> 元素的 composed 路徑是這樣的:

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

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

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-composed①

瀏覽器相容性