JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptのイベントフローとは?バブリングとキャプチャリングの違いをコード例で解説

JavaScriptにおけるイベントフローは、主に次の3つの概念によって成り立っています。

  • イベントターゲット(Event Target) … イベントが実際に発生したDOMオブジェクト。

  • イベントバブリング(Event Bubbling) … 詳細は後述します。

  • イベントキャプチャリング(Event Capturing) … 詳細は後述します。

イベントバブリングとは、ある要素が別の要素の中に入れ子になっており、両方の要素に同じ種類のイベント(クリックなど)に対するリスナーが登録されている場合の、イベントハンドラーが呼び出される順序のことです。バブリングでは、イベントはまず最も内側の要素で受け取られて処理され、その後、外側の要素へと順番に伝播していきます。

一方、キャプチャリングではこれとは逆に、イベントはまず最も外側の要素で受け取られ、内側の要素へと向かって伝播していきます。

ここからは、それぞれの挙動を具体例で確認していきましょう。以降の2つの例では、共通して次のHTMLを使用します。

検証用のHTML

<div id='outer' style='background-color:red;display:inline-block;padding:50px;'>
    Outer Div
    <div id='inner' style='background-color:yellow;display:inline-block;padding:50px;'>
        Inner Div
    </div>
</div>

赤い外側のdiv(id="outer")の中に、黄色い内側のdiv(id="inner")が入れ子になったシンプルな構造です。

イベントバブリングの例

document.querySelector('#outer').addEventListener('click', e => {
    console.log('Outer div is clicked');
}, false);
document.querySelector('#inner').addEventListener('click', e => {
    console.log('Inner div is clicked');
}, false);

addEventListener の第3引数を false にすると、リスナーはバブリングフェーズで呼び出されます。

実行結果

このコードを実行し、内側のdivをクリックすると、コンソールには次の順序でログが出力されます。

Inner div is clicked
Outer div is clicked

直接クリックされたのは内側のdivですが、イベントが内側から外側へと伝播(バブルアップ)するため、先に「Inner」のログが出力され、その後に「Outer」のログが出力されます。

イベントキャプチャリングの例

document.querySelector('#outer').addEventListener('click', e => {
    console.log('Outer div is clicked');
}, true);
document.querySelector('#inner').addEventListener('click', e => {
    console.log('Inner div is clicked');
}, true);

第3引数を true にすると、リスナーはキャプチャリングフェーズで呼び出されます。

実行結果

同じく内側のdivをクリックすると、今度は逆の順序でログが出力されます。

Outer div is clicked
Inner div is clicked

イベントが外側の要素から内側の要素へと降りていくため、先に「Outer」のログが出力されます。

まとめ

イベントフローは「キャプチャリング → ターゲット → バブリング」という順序で進みます。addEventListener の第3引数(または { capture: true } オプション)によって、リスナーをどちらのフェーズで実行するかを選択できます。実際の開発では、バブリングを活用したイベントデリゲーションなどが頻繁に使われるため、この仕組みを正しく理解しておくことは非常に重要です。

  1. JavaScriptのフォーカスイベントとは?種類と使い方を実例付きで解説

    JavaScriptのフォーカスイベントとはフォーカスイベントは、要素がフォーカスを取得したとき、あるいはフォーカスを失ったときに発生するイベントです。テキストボックスやフォーム要素をクリックしたとき、Tabキーで移動したときなどに発生し、入力フォームのバリデーションやUIの強調表示など、さまざまな場面で活用されます。主なフォーカスイベントの種類イベント説明blur要素がフォーカスを失ったときに発生します。focus要素がフォーカスを取得したときに発生します。focusin要素がフォーカスを取得しようとしているときに発生します。focusとの違いは、親要素へのバブリングが行われる点です。foc

  2. JavaScriptのイベントバブリングとイベントキャプチャの違いを徹底解説

    JavaScriptでは、DOM要素上で発生したイベントは特定の順序に従って伝播します。この伝播の仕組みには「イベントバブリング(Event Bubbling)」と「イベントキャプチャ(Event Capturing)」という2つの方式があります。本記事では、それぞれの特徴と違いを、実際に動かせるサンプルコードを交えてわかりやすく解説します。 イベントバブリングとは イベントバブリングとは、ある要素でイベントが発生したとき、まずその要素自身に登録されたイベントハンドラが実行され、その後親要素へ、さらにはすべての祖先要素へと下から上へ(子 → 親)と伝わっていく仕組みです。 イベントキャプチャと