JavaScript におけるイベント バブリング メカニズムの詳細な分析

JavaScript におけるイベント バブリング メカニズムの詳細な分析

バブリングとは何ですか?

DOM イベント フローには、イベント キャプチャ ステージ、ターゲット ステージ、イベント バブリング ステージの 3 つのステージがあります。

イベントキャプチャ: 簡単に言えば、マウスがクリックされたり、DOM イベントがトリガーされたりすると、ブラウザはルートノードのイベントを外側から内側に伝播します。つまり、子要素がクリックされた場合、親要素がイベントキャプチャを通じて対応するイベントを登録していれば、親要素にバインドされたイベントが最初にトリガーされます。

イベント バブリング (バブリングとも呼ばれる): イベント キャプチャとは対照的に、イベント バブリングは内部からルート ノードへのイベント伝播です。

DOM 標準イベント フローのトリガー順序は、最初にキャプチャしてからバブリングします。つまり、DOM イベントがトリガーされると、最初にイベントがキャプチャされ、イベント ソースがキャプチャされた後、イベントがイベント伝播を通じてバブリングされます。ブラウザによって実装は異なります。IE10 以下ではキャプチャ イベントがサポートされていないため、イベント キャプチャ ステージが 1 つ少なくなります。IE11、Chrome、Firefox、Safari などのブラウザにはすべてこの機能があります。

addEventListener() メソッド

このメソッドはイベント リスナーを設定し、特定のイベントが発生したときに指定されたパラメータを使用してアクションを実行します。構文は次のとおりです。

イベントリスナーを追加します(イベント、関数、キャプチャの使用)

パラメータ event は必須であり、クリック、タッチスタートなど、プレフィックス on のないイベントなど、監視対象のイベントを示します。

イベントがトリガーされた後に呼び出される関数を示す関数パラメータも必須です。これは外部で定義された関数または匿名関数にすることができます。

パラメーター useCapture はオプションです。イベントがバブリングかキャプチャーかを示すために、true または false を入力できます。true はキャプチャーを意味し、デフォルトの false はバブリングを意味します。

イベントリスナーを削除する

addEventListener() によって追加されたイベント リスナーを削除する場合は、removeEventListener() を使用する必要があります。構文は次のとおりです。

removeEventListener(イベント、関数)

パラメータはaddEventListener()と同じです。

互換性

IE 8 以前、および Opera 7.0 以前では、addEventListener() メソッドと removeEventListener() メソッドはサポートされていません。代わりに次のメソッドを使用します。

イベントを追加します:

アタッチイベント(イベント、関数)

イベントを削除:

**detachEvent(イベント、関数)**

互換性の問題は、次の方法で解決できます。

div1.addEventListener の場合 {
         div1.addEventListener('click', 関数() {
             console.log("サポート")
         });
} そうでない場合 (div1.attachEvent) {
         div1.attachEvent('onclick', 関数() {
             console.log("サポートされていません")
         });
}

バブリングとキャプチャーの具体的な違い

html

    <div id="div1">
         <div id="div2"></div>
    </div>

JS

<スクリプト>
        var div1 = document.getElementById("div1");
        div2 要素を取得します。
        div1.addEventListener('click',function(){
            console.log("div1--キャプチャフェーズ")
        }、真実);
        div2.addEventListener('click',function(){
            console.log("div2--キャプチャフェーズ")
        }、真実);
        div1.addEventListener('click',function(){
            console.log("div1--バブルステージ")
        });
        div2.addEventListener('click',function(){
            console.log("div2--バブルステージ")
        });
</スクリプト>

出力結果(div2をクリックしたときの実行結果)

解決

関数stopBubble(e) {
         e && e.stopPropagation の場合 {
                e.stopPropagation(); //W3CのstopPropagation()メソッドをサポートします } else {
             window.event.cancelBubble = true; // それ以外の場合は、IE のメソッドを使用してイベントのバブリングをキャンセルする必要があります}
}

要約する

JavaScript のイベント バブリング メカニズムに関するこの記事はこれで終わりです。JavaScript イベント バブリングに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • js におけるイベントバブリングとイベントキャプチャの簡単な分析
  • JS でのイベント バブリングとイベント キャプチャの概要
  • JSバブリングイベントとイベントキャプチャ例の詳細な説明
  • jsイベント委譲の詳細な説明
  • JavaScriptはイベントリスナーをイベント委任にバッチで追加します。詳細なプロセス
  • JavaScript イベントバブリング、イベントキャプチャ、イベント委任の詳細な説明

<<:  Linux ログ内のキーワードとその前後の情報を検索する方法の例

>>:  CentOS7 に MySQL データベースをインストールしてデバッグする詳細な手順 [例]

推薦する

Nginx 仮想ホスト (IP ベース) を構成する 3 つの方法の詳細な説明

Nginx は、IP ベースの仮想ホスト構成、ポート ベースの仮想ホスト構成、ドメイン名ベースの仮想...

Reactを使用して画像認識アプリを実装する方法

まずは効果の写真をお見せしましょう。 個人的には効果は問題ないと思います。アプリが写真を学習する時間...

SQL重複排除方法の概要

SQL を使用してデータを抽出する場合、テーブル内で重複した値に遭遇することがよくあります。たとえ...

Kylin V10 への zabbix-agent のインストール手順

1. インストールパッケージをダウンロードするダウンロードアドレス: https://sourcef...

MySQL 8の新機能ROLEの詳しい説明

MySQL ROLE はどのような問題を解決しますか?プロフェッショナルな資質を持ち、権限管理に細心...

JSは写真の自動再生効果を実現します

この記事では、写真の自動再生効果を実現するためのJSの具体的なコードを参考までに紹介します。具体的な...

JavaScript を使用して動的に生成されるテーブルの詳細な説明

*ページを作成する: 2つの入力ボックスとボタン*コードと手順/* 1. 入力行と列の値を取得する2...

Linuxの運用と保守の基本プロセス管理と環境構成分析

目次1. プロセスの基本的な概要2. プロセスの構成要素3. プロセス環境4. プロセスステータス5...

MySQLデータベースは重複データを削除し、メソッドインスタンスを1つだけ保持します

1. 問題の紹介ユーザー テーブルに 3 つのフィールドが含まれているシナリオを想定します。 id、...

フロントエンドエンジニアが作ったクールなインタラクティブウェブサイトを推薦します

ウェブサイトリンク: http://strml.net/サミュエル・リード著ヒント: 昨日、Mome...

ログインフォームを実装するためのReactサンプルコード

Vue ユーザーとして、React を拡張する時が来ました。antd の導入、less と rout...

ReactとReduxの配列処理の説明

この記事では、reduce()、filter()、map()、every()、some()、spre...

Dockerコンテナでユーザーを切り替えるときに権限が不足する問題を解決する方法

Docker コンテナでユーザーを切り替えると、権限が不十分であるというメッセージが表示されます。解...

アリババの中秋節ロゴとウェブサイトのデザインプロセス

<br />まずアイデアを考え、次にスケッチを描き、次にマウスでスケッチし、最後にフラッ...

WeChatアプレットwebViewにH5を埋め込む方法の例

序文WeChat ミニプログラムは新しいオープン機能を提供します!ついにミニプログラムにHTMLペー...