JavaScript イベントバブリング、イベントキャプチャ、イベント委任の詳細な説明

JavaScript イベントバブリング、イベントキャプチャ、イベント委任の詳細な説明

1. イベントバブリング: JavaScript イベント伝播のプロセスでは、要素でイベントがトリガーされると、そのイベントはドキュメントまで段階的に先行要素に伝播し、一部のブラウザではウィンドウに到達することがあります。すべてのイベントにバブリングがあるわけではありません。例: blurイベント、 focusイベント、 loadイベント

2. イベント委任: イベント キャプチャは、イベント バブリングと正反対です。イベントが要素をトリガーするまで、最上位の祖先要素から開始されます。

js イベント キャプチャは通常、DOM2 イベント モデルaddEventListenerを通じて実装されます。

target.addEventListener(タイプ、リスナー、useCapture)

3 番目のパラメータはデフォルトで false に設定されており、イベントがバブリング フェーズでトリガーされることを示します。true に設定すると、キャプチャ フェーズでトリガーされます。一般に、イベント キャプチャは私たちの作業ではほとんど使用されないようです。しかし、まだ理解する必要がある

<div id="ボックス">
    <div id="middle">
        <div id="内部"></div>
    </div>
</div>
<スクリプト>
//イベントキャプチャ window.onload=function(){
    box = document.getElementById("box"); とします。
    middle = document.getElementById("middle"); とします。
    inner を document.getElementById("inner"); とします。
    box.addEventListener("click",function(){console.log("box")},true);
    middle.addEventListener("click",function(){console.log("middle")},true);
    inner.addEventListener("click",function(){console.log("inner")},true);
}
</スクリプト>
innerをクリックすると、コンソールにbox、middle、innerと出力されます。

イベントのバブリングを停止

通常、多数のイベントバブリングイベントが使用されますが、特定の子タグでは親にイベントを渡す必要がない場合があります。このとき、そのイベントのバブリングを防ぐ必要があります。

一般的に、stopPropagation はイベントのバブリングを防ぐために使用されます。IE では、cancelBuble=true が使用されます。stopPropagation もイベント オブジェクト (Event) のメソッドです。その機能は、対象要素のイベントのバブリングを防ぐことですが、デフォルトの動作を防ぐことはできません。

//イベントのバブルを防ぐ let btna = document.getElementById('btn');
btna.onclick=関数(e){
    window.event? window.event.cancelBubble = true : e.stopPropagation();
 };

3. イベント委任: イベント委任はイベント プロキシとも呼ばれます。イベント委任ではイベント バブリングを利用します。イベント ハンドラーを 1 つだけ指定することで、特定のタイプのすべてのイベントを管理できます。

利点: DOM 操作を減らすと、Web ページのパフォーマンスが向上します。ページの親要素と多くの子要素が同じイベントを操作する必要がある場合、各要素にイベントをバインドすることはできません。

<ul id="getNum">
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
    <li>5</li>
    <li>6</li>
</ul>
<スクリプト>
ptclick = document.getElementById('getNum'); とします。
lilist = ptclick.querySelectorAll('li') とします。
for(let i=0;i<lilist.length;i++){
    lilist[i].index = i;
};
ptclick.onclick = 関数(e){
    var e = e || window.event;
    var ターゲット = e.target || e.srcElement;
    console.log(e.target.index);
};
</スクリプト>

要約する

この記事はこれで終わりです。皆さんのお役に立てれば幸いです。また、123WORDPRESS.COM のその他のコンテンツにも注目していただければ幸いです。

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

<<:  CSS マルチカラムレイアウトソリューション

>>:  HTMLページでよく使われるいくつかの小さなメソッド

推薦する

Docker共通コマンドの詳しい解説 Study03

目次1. ヘルプコマンド2. ミラーコマンド3. コンテナコマンド1. ヘルプコマンド1. 現在のD...

MySQL データベース テーブルとデータベース パーティショニング戦略

まず、テーブルを分割する必要がある理由について説明します。データシートが数百万に達すると、1 回のク...

MySQL のファントムリード問題を解決する方法

目次序文1. ファントムリーディングとは何ですか? 2. ファントムリーディングの問題点は何ですか?...

フロントエンドJavaScriptのクラス

目次1. クラス1.1 コンストラクタ() 1.2 ゲッターとセッター1.3 これ1.4 静的プロパ...

docker に nacos をインストールしてデータベースを構成する詳細なチュートリアル

環境の準備 Docker環境 MySQL 5.7 (公式イメージはmysql8をサポートしていません...

Linux サーバーのスクリプトを自動的にバックアップする方法 (mysql、添付ファイルのバックアップ)

1.backup.shスクリプトファイルを作成する #!/bin/sh ソースフォルダ=/データ ...

IDEA が Docker を統合してリモート展開を実現するための手順

1. Dockerサーバーへのリモートアクセスを有効にするdocker が配置されているリモート サ...

Nginx ドメイン名の書き換えとワイルドカードドメイン名の解決を設定する方法

この記事では、ドメイン名の書き換えとワイルドカードドメイン名の解決を行うための Nginx の設定方...

CentOS の環境変数と設定ファイルの詳細な説明

序文CentOS 環境変数設定ファイル システムは階層型システムであり、他のマルチユーザー アプリケ...

カーソル ループを使用して、MySQL ストアド プロシージャで一時テーブルを読み取る

カーソルカーソルは、結果セット内のデータを表示または処理するために使用される方法です。カーソルを使用...

Vueはシンプルな計算機を実装する

この記事では、参考までに、Vue の具体的なコードで簡単な計算機を実装する方法を紹介します。具体的な...

アイデアのパッケージ化とクラウドサービスへのアップロードにおけるプロジェクトプロセスの分析

1つ。まず、アイデアとしてパッケージ化する必要があります。私はSpringbootフレームワークプロ...

Zabbixを使用してMySQLを監視する方法

Zabbix 導入ドキュメントzabbix導入後zabbixエージェントの操作1. MySQLを監視...

Nginx での Frp による https への強制リダイレクト設定の詳細な説明

自宅のルーターが300Mの帯域幅を80Mに強制的に減らしたため、3205Uソフトルーターを購入しまし...

構造とプレゼンテーションの分離を理解するためのWeb標準の学習

Web 標準について議論するときに必ず話題になるのは、構造とプレゼンテーションを分離することの重要性...