JavaScript イベント委任の原則

JavaScript イベント委任の原則

1. イベント委任とは何ですか?

イベント委任はイベント プロキシとも呼ばれます。イベントバブリングを使用して、子要素のすべてのイベントを親要素にバインドします。子要素がイベントのバブルを妨げる場合、委任は実現できません。

以下に簡単な例を示します。

たとえば、宅配業者が 100 人の学生に 100 個の荷物を配達する場合、荷物を 1 つずつ配達するには長い時間がかかります。同時に、各生徒がそれを受け取るために列に並ぶ必要があり、時間がかかります。どのようにすればよいでしょうか?この時点で、宅配業者は 100 個の速達小包をクラスの先生に託すことができ、先生はそれを事務室に置き、生徒は授業後に受け取ることができます。この方法により、宅配業者は時間を節約でき、学生にとっても荷物を受け取るのがより便利になります。このプロセスは委任イベントです。

2. イベント委任の原則

各子ノードに個別イベント リスナーを設定する代わりに、イベント リスナーを親ノードに設定し、バブリング原理を使用して各子ノードの設定に影響を与えます。

具体的なプログラムでどのように実装されているか見てみましょう。
たとえば、現在 5 つの li を含む順序なしリストがあります。各 li にクリック イベントを追加する必要があります。この時点での通常の操作は、ループを通じて各 li にクリック イベントを追加することです。

コードは次のようになります。

<本文>
    <ul>
        <li>111111</li>
        <li>222222</li>
        <li>333333</li>
        <li>444444</li>
        <li>555555</li>
    </ul>
    <スクリプト>
        var li = document.querySelectorAll('li');
        for(var i=0;i<li.length;i++){
            li[i].onclick = 関数(){
                this.style.color = '緑';
            }
        }
    </スクリプト>
</本文>

実行結果は次のとおりです。

この方法は確かにクリック操作を実現できますが、このプロセスではクリック イベントを毎回 li に追加する必要があるため、DOM アクセスが多すぎて、ページ全体のインタラクション準備時間が長くなります。

したがって、ここではイベント委任を使用できます。つまり、ul のクリック イベントを登録し、イベント オブジェクトのターゲットを使用して、現在クリックされている li を検索します。li がクリックされると、イベントが ul にバブルされ、ul に登録されたイベントがある場合は、イベント リスナーがトリガーされます。

実装コードは次のとおりです。

<スクリプト>
        var ul = document.querySelector('ul');
        ul.addEventListener('クリック',function(e){
            e.target.style.color = 'オレンジ';
        })
    </スクリプト>


実行結果は次のとおりです。

正常に表示されました。

3. イベント委託の役割

上記の操作により、イベント委任では DOM を 1 回だけ操作するため、プログラムのパフォーマンスが大幅に向上します。

JavaScript イベント委任の原則に関するこの記事はこれで終わりです。JavaScript イベント委任に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。皆様が今後とも 123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • jsイベント委譲の詳細な説明
  • JS でのイベント委譲例の簡単な分析
  • ウェブメッセージボード機能を実現するjs
  • Web メッセージボード機能を実装する JavaScript
  • メッセージボードのネイティブJS実装
  • この記事では、イベント委任を使用してJavaScriptメッセージボード機能を実装する方法について説明します。

<<:  CSS3 で transform を使用した場合のフォントぼかしの解決方法の詳細な説明

>>:  VirtualBox の仮想ディスク vdi ファイルの容量を拡張する方法 (グラフィック チュートリアル)

推薦する

mysql5.7.20 のインストールと設定方法のグラフィック チュートリアル (mac)

MySQL 5.7.20のインストールと設定方法のグラフィックチュートリアルをあなたと共有します1...

docker イメージのプル速度が遅い問題の解決策

現在、Docker には中国向けの公式ミラーがあります。詳細については、https://www.do...

HTMLは角丸四角形を簡単に実装します

質問: div+css と配置を使用して角丸四角形を実現するにはどうすればよいですか?ソリューション...

スペース均等互換性の問題を解決する2つの方法についての簡単な説明

flex は 2009 年のリリース以来、ほぼすべてのブラウザでサポートされています。シンプルでレス...

MySQL トランザクション分離レベルの詳細

serializableシリアル化(問題なし)トランザクションは順次実行する必要があります。前のトラ...

Ubuntu 20.04 LTSの詳細なインストール履歴

この記事では、USB ブート ディスクの作成とシステムのインストールについて説明します。システム構成...

forループ内のvarの問題の解決

序文var は ES5 における変数宣言方法です。var で変数を宣言するとループ変数がグローバル変...

CSSコンテンツ属性の具体的な使用法

コンテンツ属性は通常、::before および ::after 疑似要素で使用され、疑似要素のコンテ...

Linux での Firewalld の高度な設定の使用に関する詳細な説明

IPマスカレードとポート転送Firewalldは2種類のネットワークアドレス変換をサポートしています...

MySQLデータベーストリガーの詳細な説明

目次1 はじめに2 トリガーの紹介3 トリガーを作成する4 トリガーを表示5. トリガーの削除6 結...

Windows 8.1 で MySQL5.7 のルート パスワードを忘れた場合の解決方法

【背景】最近勉強中に非常に恥ずかしいことに遭遇しました。MySQL のパスワードを忘れてしまい、My...

Linux コンパイル最適化で習得しなければならないいくつかの姿勢のまとめ

01. コンパイルオプションとカーネルコンパイルLinux カーネル (英語: linux kern...

JavaScript フロー制御 (分岐)

目次1. プロセス制御2. シーケンシャルプロセス制御3. 分岐フロー制御if文1. 支店構造2. ...