知名度が低いウェブ標準ひとり Advent Calendar 2021 – 11 日目
今日は event.composedPath() です。jQuery の parents() を思い出します。
基本的な使い方
イベントが発火した要素 event.target から順に要素のパス?の根本までの要素オブジェクトを配列で返します。
el.addEventListener('click', (event) => {
console.log(event.composedPath());
// => [button, span#elButton, p, header, article, body, html, document, Window]
});
イベントリスナーを登録した要素 event.currentTarget ではない。
イベント用
ノードではなくイベントのメソッドなので、任意の要素のツリー情報を得る感じではないです。たぶんそういうのないよね? while あたりで自作しましょう。
シャドウルート対応
ウェブコンポーネントのシャドウルートに対応していて、shadowRoot.mode === "closed" の場合は内側の要素を飛ばしてウェブコンポーネントの要素 <my-element> がひとつめになります。
- デモ(shadow root):https://codepen.io/ginpei/pen/yLzaxap
おしまい
使いどころは何かありそうだけど、思い付きませんでした。条件に合致する直近の祖先ノードを array.find() で……いや element.closest() があるしなあ。バブリングの制御とかで使うんだろうか。
冒頭で「要素のパス?の根本」と書いたけど、ドキュメントルートの要素は <html> だしそこから document, window と取れてるのはどういう表現するのが正解なんだろう? イベントバブリングの入れ子っぽいけど名前あるんだろうか。仕様書の path ってめっちゃ普通の単語だけどこれでいいのかな。