イベントフローとは?
JavaScriptのイベントフローは、ユーザーが操作(クリックやキー入力など)を行った際、イベントがどのようにブラウザ内で処理されるかを指します。イベントフローには「キャプチャリング」と「バブリング」という2つのフェーズがあり、イベントがどの順序で要素に伝わるかを制御できます。
キャプチャリングとバブリングの概要
キャプチャリングは、最外部の要素からターゲット要素に向かってイベントが伝達するフェーズです。一方、バブリングは、ターゲット要素から最外部の要素に向かってイベントが伝わるフェーズです。
document.querySelector("div").addEventListener("click", function(event) {
console.log("Div clicked");
}, true); // trueはキャプチャリングフェーズで実行
document.querySelector("button").addEventListener("click", function(event) {
console.log("Button clicked");
}, false); // falseはバブリングフェーズで実行
この例では、div
要素がキャプチャリングフェーズでクリックされた際に処理が実行され、button
要素がバブリングフェーズで処理されます。
イベントフローのフェーズ
イベントフローは以下の3つのフェーズで構成されています。
- キャプチャリングフェーズ: 最外部の要素からターゲット要素へ向かってイベントが伝わる
- ターゲットフェーズ: イベントがターゲット要素に到達し、処理される
- バブリングフェーズ: ターゲット要素から最外部の要素に向かってイベントが伝わる
イベントフローの流れ
イベントがどの順序で伝達されるかを、以下の図で説明します。
フェーズ | 説明 |
---|---|
キャプチャリングフェーズ | 最外部の要素からターゲット要素へ向かうフェーズ |
ターゲットフェーズ | ターゲット要素でイベントが処理されるフェーズ |
バブリングフェーズ | ターゲット要素から最外部の要素へ伝わるフェーズ |
キャプチャリングフェーズの詳細
キャプチャリングフェーズでは、最外部の要素からイベントが内側に向かって伝わります。イベントリスナーをキャプチャリングフェーズで実行するには、addEventListener
メソッドの3番目の引数にtrue
を指定します。
キャプチャリングフェーズの例
const div = document.querySelector("div");
const button = document.querySelector("button");
div.addEventListener("click", function(event) {
console.log("Div clicked during capture phase");
}, true);
button.addEventListener("click", function(event) {
console.log("Button clicked during capture phase");
}, true);
この例では、クリックイベントが外部のdiv
要素からキャプチャリングフェーズで処理され、内部のbutton
要素で処理されます。
バブリングフェーズの詳細
バブリングフェーズでは、ターゲット要素からイベントが外側に向かって伝わります。イベントリスナーをバブリングフェーズで実行するには、addEventListener
メソッドの3番目の引数にfalse
(または省略)を指定します。
バブリングフェーズの例
const div = document.querySelector("div");
const button = document.querySelector("button");
div.addEventListener("click", function(event) {
console.log("Div clicked during bubbling phase");
}, false);
button.addEventListener("click", function(event) {
console.log("Button clicked during bubbling phase");
}, false);
この例では、バブリングフェーズでbutton
要素のクリックイベントが処理され、その後div
要素に伝わります。
イベントフローの管理
JavaScriptでは、stopPropagation()
メソッドを使用して、イベントがバブリングまたはキャプチャリングフェーズで親要素に伝わるのを防ぐことができます。
イベントの伝播を停止する例
const button = document.querySelector("button");
const div = document.querySelector("div");
button.addEventListener("click", function(event) {
console.log("Button clicked");
event.stopPropagation(); // ここでイベントの伝播を停止
});
div.addEventListener("click", function(event) {
console.log("Div clicked");
});
この例では、button
要素がクリックされた後、stopPropagation()
メソッドによりdiv
要素へのイベントの伝播が停止されます。
まとめ
JavaScriptのイベントフローでは、キャプチャリングフェーズとバブリングフェーズを通じてイベントが伝達されます。キャプチャリングは外部から内側へ、バブリングは内側から外側へイベントが伝わる仕組みです。また、イベントの伝播を制御するためにstopPropagation()
を使用してイベントフローを制御することができます。これらを理解することで、より高度なイベント管理が可能になります。