javascriptのEvent流れ(2)

ワン
2020-09-01
ワン
2020-09-01

前置き

皆さん!こんにちは!

久しぶりです!
ワンです!

今回はJavascriptのEvent流れ(2)です!!!

では、勉強してみましょう!

Event Captureって?

今回の始まりはEvent Captureです。
Event CaptureはEvent Bubblingとは逆方向に進むEvent伝送方式です。
unserialize.jpg
上図のように、特定のeventが発生した時に最上位要素である body タグから該当タグを探します。では、Event Captureはコードでどのように実装するのでしょうか?

```
<body>
   <div class='one'>
      <div class='two'>
         <div class='three'>
         </div>
      </div>
   </div>
</body>

var divTag = document.querySelectorAll('div');
divTag.forEach(function (div) {
   div.addEventListener('click', showTag, {capture: true}); //default値はfalseです
});

function showTag(event) {
   console.log(event.currentTarget.className);
}
```

このように、addEventListener APIのオプションオブジェクトに「capture:true」を設定すればOKです。
すると、そのEventを検知するためにEventBubblingと反対方向に探索します。

したがって、前回の記事にあったEventBubblingと同様に
<div class="three"><div>をクリックしても以下のような結果が現れます。
スクリーンショット 2020-08-13 12.46.36.png

難しい!要素のEventだけ知ってはいけませんか?

「複雑なEventの伝達方法を知りたくなくて、ただ必要な画面要素のEventだけ、気にしたい」
と考えるかもしれません。その場合は、以下のようにstopPropagation APIを使います。

```
function showTag(event) {
   event.stopPropagation();
}

```

上記APIは、該当Eventの伝播を防ぎます。
したがって、EventBubblingの場合にはクリックした要素のEventだけを発生させ、
上位要素にEventを伝えることを妨げます。 そしてEventCaptureの場合は、
クリックした要素の最上位要素のEventだけを動作させ、下位要素としてEventを伝達しません。

上記のようにstopPropagation APIを使ったら、
「EventBubbling例題」と「EventCapture例題」で使ったコードの結果は、
それぞれ「three」と「one」だけ表示されますね。

最後に

今日はここまで、EventCaptureとまで紹介いたしました。
次はこの流れシリーズの最終:Event Delegationです!
では!🙇‍♂️