イベントのバブリングが 2 回連続して発生するのはなぜですか?
イベント バブリングは Web 開発における重要な概念です。これは、ネストされた HTML 要素でイベントがトリガーされると、イベントが最も内側の要素から最も外側の要素までバブルアップすることを意味します。このプロセスは時々混乱を引き起こす可能性があり、よくある問題の 1 つは、イベントのバブリングが 2 回続けて発生することです。
イベント バブリングが 2 回連続して発生する理由をより深く理解するために、まずコード例を見てみましょう:
<div id="outer"> <div id="inner"> <button id="button">Click me</button> </div> </div> <script> document.getElementById('button').addEventListener('click', function() { console.log('Button clicked'); }); document.getElementById('inner').addEventListener('click', function() { console.log('Inner div clicked'); }); document.getElementById('outer').addEventListener('click', function() { console.log('Outer div clicked'); }); </script>
上記のコードは、最も外側の ## を含むネストされた HTML 構造を作成します。 #
要素 (id="outer")、ネストされた
>gt; 要素 (id="inner")、および Button 要素 (id="button")。
このコードでは、各要素のクリック イベント リスナーを追加して、対応する要素のクリックに関する情報を出力します。ページ上のボタンをクリックすると、予期される出力は次のようになります: Button clicked Inner div clicked Outer div clicked
Button clicked Inner div clicked Outer div clicked Inner div clicked Outer div clicked
要素までバブルアップして、要素のイベント ハンドラーの実行を継続します。ただし、
要素は最も外側の
要素にもネストされているため、イベントは再び最も外側の要素までバブルアップされ、その結果、最も外側のイベント ハンドラーが生成されます。関数が再度実行されます。
この問題を解決するには多くの方法があります。一般的に使用される 2 つの方法を紹介します: イベント処理関数のevent.stopPropagation()メソッドを使用すると、イベントのさらなる伝播を防ぐことができます。つまり、イベントのバブリングを停止できます。上記のコード例のボタンのイベント ハンドラー関数を次のように変更します。
document.getElementById('button').addEventListener('click', function(event) { console.log('Button clicked'); event.stopPropagation(); // 阻止事件冒泡 });
event.stopPropagation() メソッドを使用した後、イベントのバブリングはボタン要素で停止し、ネストされた
要素と最も外側の
要素では、埋め込み要素には伝播されません。したがって、イベント処理関数は 1 回だけ実行され、出力結果は次のようになります。
Button clicked
要素のイベント ハンドラー関数を次のように変更します。
document.getElementById('outer').addEventListener('click', function() { console.log('Outer div clicked'); }, true); // 添加 true 参数表示监听捕获阶段
true を最も外側の要素 Event に追加します。リスナーはキャプチャフェーズ中にイベント処理関数を実行できます。このようにして、イベントのバブリング段階では、イベントによって最も外側の要素のイベント処理関数が再度トリガーされることがなくなり、繰り返しの実行が回避されます。
event.stopPropagation() メソッドを使用してイベントのバブリングを防ぐか、キャプチャ フェーズをリッスンしてイベントを処理して繰り返し実行を避けることができます。
以上がイベント バブリング メカニズムが 2 回トリガーされるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。