Open2
JS弱者の僕が得た知見をまとめる
target
ではなくcurrentTarget
を使う
Eventオブジェクトからクリックされた要素を取得する時はMouseEvent
のtarget
プロパティはクリック・タップされた「まさにその要素」を指し示す。
もしクリック・タップされた要素の中に別の要素が入れ子になっていて、ユーザーがクリックしたのがその入れ子の要素だったとすると、target
プロパティではその入れ子要素が行方不明になる。
イベントハンドラを登録した当の要素を取得するにはcurrentTarget
を利用する。
stopPropagation
はCSSの!important
と似たようなもの
CSSの!important
を無闇に指定してはいけないのと同様に、stopPropagation
は最後の手段として取っておくべき。
具体的な例を挙げると、ページの他の部分にモーダルのコンポーネントがあったとする。コンポーネントはクリックで開閉する機能とコンポーネントの外側をクリックすると閉じる機能を持っている。
この「コンポーネントの外側をクリックすると閉じる」機能は典型的には以下のようなコードで実装することが多い。
document.addEventListener("click", (e) => {
if (!popup.element.contains(e.target)) {
popup.close();
}
});
このclick
イベントハンドラが実行されるのは、click
イベントがバブリングして document まで到達した時。
stopPropagation
はバブリングを止めてしまうので、こういうケースでは不具合になる。
原因の究明が難しくなりバグの温床になりがちなのでstopPropagation
は原則使わないようにする。