javascriptのEvent流れ(1)

ワン
2020-06-10
ワン
2020-06-10

前置き

皆さん!こんにちは!

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

最近、新型コロナが流行ってますね。。😢
早く落ち着いておしいです!

皆さんもぜひ、マスクと手洗いを!

では、今回はJavasciptでEventの流れに対して勉強しましょう!

Event登録

皆さん、ご存知通りwebApplicationのEventの登録です!
ここで言ってるEvent登録はユーザーの入力が必要なところです!

下のコードをみましょう。

```
 <button> Item追加 </ button>

var button = document.querySelector ( 'button');
button.addEventListener ( 'click', createItem);

function createItem (event) {
console .log (event);
}
```
 

「Item追加」という簡単なボタンを作りました。クリックした時「createItem」というfunctionを実行します。
ボタンをクリックした後、「createItem」が実行されて「createItem」functionが「Event」parameterをもらいます。

このように「addEventListener」みたいなWebAPIはユーザーの入力によってEventを作れます。
では、ここでブラウザはEventの発生をどうやって感知していると思いますか。

これから、やってみましょう!

Event Bubblingって?

「Event Bubbling」は特定の画面要素からEventが発生する時、そのEventがもっと上の画面要素に伝達されていく特性と言います。
下の絵をご覧ください

Eventの発生.png


* 上位の画面要素とは? HTML 要素は、基本的にツリー構造を持ちます。
* ここではツリー構造上、一段階上にある要素を上位要素と呼び、bodyタグを最上位要素と呼びます。

例を挙げます。三つのdivタグがあって一番下にあるdivタグからEventが発生した時、
最上位要素のbodyタグまでEventが伝達させてます。→ もちろん、コードで

```


<
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); });

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

```
 上のコードは三つのdivタグにクリックEventを登録し、クリックした時showTagを実行させます。
ここで、一番下位divタグをクリックしたら

例.png

が出ます。divタグは一個クリックしたのに、なぜ、三つのEventが発生するんでしょうか?

その理由はブラウザがEventを感知する方法のためです。

ブラウザは、特定の画面要素でEventが発生した時、そのEventを最上位の画面要素までEventを伝播させます。
したがって、class名が「three」→「two」→「one」の順序でdivタグに登録されたEventが実行されます。
同様に、「two」classを持ってる2番目のタグをクリックしたら、「two」→「one」の順にクリックEventが動作します。

ここで注意すべき点は、タグごとにEventが登録されているので、上位要素にEventが配信されることを確認できます。
もしEventが特定のdivタグにしか移っていなければ、上記のような動作結果は確認できませんでしょうね?

このような下位から上位要素へのEvent伝播方式を「Event Bubbling」といいます。

最後に


今日はここまで、Eventの発生、EventBubblingまで紹介いたしました。

次はEventCaptureに対してやってみましょう!

では!