JavaScriptのイベント伝播とは?バブリングとキャプチャリングをJavaエンジニア向けにやさしく解説!

こんにちは。ゆうせいです。

今回は、Javaを学んできた新人エンジニアのみなさんに向けて、JavaScriptのイベント伝播(event propagation)についてわかりやすく解説していきます。

JavaScriptにおける「イベント伝播」は、DOM(Document Object Model)上でイベントがどのように流れて処理されるかを意味します。

一見Javaのイベントリスナーに似ている部分もありますが、JavaScript特有の仕組みが存在します。


イベント伝播とは?

JavaScriptでボタンをクリックしたとき、そのイベントが親の要素や祖先の要素にまで影響を及ぼすことがあります。

その仕組みこそが「イベント伝播」です。

イベント伝播には、次の2つのフェーズがあります。

フェーズ名説明
キャプチャリング(捕捉)一番外側の要素から内側の要素へ向かって伝播していく段階
バブリング(泡上がり)内側の要素から外側の要素へ向かって伝播していく段階

これらを理解することで、意図しないイベントの発火や、イベントの制御ミスを防ぐことができます。


具体的な例でイメージしよう

たとえば、HTMLに次のような構造があるとしましょう。

<div id="parent">
  <button id="child">クリック</button>
</div>

このとき、#child(ボタン)をクリックすると、

  1. キャプチャリングでは、document → html → body → #parent → #child という順番でイベントが下に降りてきます。
  2. バブリングでは、逆に #child → #parent → body → html → document とイベントが泡のように上へ上っていきます。

Javaとの違いに注意!

JavaのAWTSwingでは、リスナーを登録したコンポーネントにしかイベントが届かないことがほとんどです。

しかし、JavaScriptでは親要素にも自動的にイベントが「伝播」するのがポイントです。


JavaScriptのコードで確認

document.getElementById("parent").addEventListener("click", function() {
  console.log("親がクリックされました");
});

document.getElementById("child").addEventListener("click", function() {
  console.log("子がクリックされました");
});

このコードでボタンをクリックすると、出力は次のようになります:

子がクリックされました
親がクリックされました

なぜでしょう?

これは、バブリングがデフォルトで有効だからです。イベントは子要素で発生し、親要素へと伝播していくためです。


キャプチャリングを使いたいときは?

イベントリスナーを設定するとき、第3引数に true を渡すと、キャプチャリングフェーズでイベントをキャッチできます。

document.getElementById("parent").addEventListener("click", function() {
  console.log("キャプチャ中の親");
}, true);

このコードだと、キャプチャリング中にイベントが処理されます。


イベントを止めるには?

イベントの伝播を途中で止めたい場合、次のメソッドを使います:

event.stopPropagation()

これを使うと、イベントが親要素へバブリングまたはキャプチャリングしなくなります。

document.getElementById("child").addEventListener("click", function(event) {
  event.stopPropagation();
  console.log("子だけ処理されました");
});


まとめ:イベント伝播の流れを図で確認!

キャプチャリングフェーズ
document

html

body

div(親)

button(子) ← イベント発生!

div(親)

body

html

document
バブリングフェーズ



メリットとデメリット

観点メリットデメリット
バブリング親要素でイベントをまとめて処理できる(効率的)意図しない箇所でイベントが発火する可能性がある
キャプチャイベントの早い段階で処理を制御できる設定に true を明示しないと使われないため、使い方が少し特殊
stopPropagation柔軟にイベント伝播を止められる過剰に使うと保守性が下がる可能性がある

今後の学習の指針

次のステップとしては、以下の学習をオススメします。

  • event.targetevent.currentTarget の違い
  • 委譲(イベントデリゲーション)による効率的なハンドリング
  • ReactやVueなど、フレームワークでのイベント管理の仕組み

イベント伝播はJavaScriptを使った開発の基礎中の基礎です。

Javaの知識を持っているからこそ、違いに敏感に気づけるはず!ぜひ手を動かして感覚を掴んでいきましょう。

他にも気になるテーマがあれば、どんどん聞いてくださいね!

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。