JavaScript イベント委任 (プロキシ) の使用例の詳細

JavaScript イベント委任 (プロキシ) の使用例の詳細

導入

例示する

この記事では、JavaScript でのイベントの委任 (delegate) の使用方法を例を使って紹介します。

イベント委任の概要

イベント委任 (イベント プロキシとも呼ばれる) は、JavaScript でイベントをバインドするための一般的な手法です。これは、本来は子要素にバインドする必要がある応答イベントを親要素または外部要素に委任し、外部要素がイベント監視の責任を引き受けられるようにすることです。

イベント委任の原則は、DOM 要素のイベント バブリングです。

イベント委任の利点

1. メモリを節約し、イベントバインディングを減らす

元々、イベントはすべての子要素にバインドする必要がありましたが、イベント委任を使用した後は、必要なイベント バインディングは 1 つだけになります。

2. イベントは動的にバインドでき、新しく追加されたサブオブジェクトイベントはバインドされたイベントによって処理できます。

新しく追加された子オブジェクトによって生成されたイベントは、最終的に親要素にバブルアップされ、処理できるようになるため、

例: イベントの委任

要件: リスト要素をクリックするとコンテンツがポップアップ表示されるリスト。

記述方法1: イベント委譲

イベントを外側の要素にバインドするだけです。

 <!doctypehtml>
<html lang="ja">
 
<ヘッド>
    <メタ文字セット="UTF-8">
    <title>これはタイトルです</title>
</head>
 
<本文>
 
<ul id="id-ul">
    <li>私は最初のliです</li>
    <li>私は2番目のliです</li>
    <li>私は3番目のliです</li>
</ul>
 
<スクリプト>
    ul = document.getElementById('id-ul'); とします。
    ul.addEventListener("クリック", 関数(ev) {
        アラート(ev.target.innerText);
    })
</スクリプト>
 
</本文>
</html>

結果

記述方法2: 各子要素はイベントにバインドされます

各子要素にはイベントがバインドされています。

 <!doctypehtml>
<html lang="ja">
 
<ヘッド>
    <メタ文字セット="UTF-8">
    <title>これはタイトルです</title>
</head>
 
<本文>
 
<ul id="id-ul">
    <li>私は最初のliです</li>
    <li>私は2番目のliです</li>
    <li>私は3番目のliです</li>
</ul>
 
<スクリプト>
    li = document.querySelectorAll('#id-ul li') とします。
    for (let liElement of li) {
        liElement.addEventListener("クリック", 関数(ev) {
            アラート(ev.target.innerText);
        });
    }
</スクリプト>
 
</本文>
</html>

結果

例: 新しい要素を追加する

要件: 「生成ボタン」をクリックするたびに、サブリスト要素が生成されます。その後、リスト要素をクリックするたびに、その内容がポップアップ表示されます。

記述方法1: イベント委譲

<!doctypehtml>
<html lang="ja">
 
<ヘッド>
    <メタ文字セット="UTF-8">
    <title>これはタイトルです</title>
</head>
 
<本文>
 
<ul id="id-ul">
    <li>1</li>
    <li>2</li>
</ul>
<button id="btn">クリック</button>
<スクリプト>
    num = 3 とします。
    eUl = document.querySelector("#id-ul");
    eButton を document.querySelector("#btn") とします。
 
    eButton.addEventListener("クリック", 関数() {
        newLi = document.createElement("li");
        eUl.appendChild(newLi);
        新しいLi.innerText = num++;
    })
    eUl.addEventListener("クリック",関数(イベント) {
        アラート(event.target.innerText);
    })
</スクリプト>
 
</本文>
</html>

結果

ご覧のとおり、既存の要素と新しく作成された要素の両方のイベントが処理されます。

記述方法2: 各子要素はイベントにバインドされます

<!doctypehtml>
<html lang="ja">
 
<ヘッド>
    <メタ文字セット="UTF-8">
    <title>これはタイトルです</title>
</head>
 
<本文>
 
<ul id="id-ul">
    <li>1</li>
    <li>2</li>
</ul>
<button id="btn">クリック</button>
<スクリプト>
    num = 3 とします。
    eUl = document.querySelector("#id-ul");
    eButton を document.querySelector("#btn") とします。
    eLi = document.querySelectorAll("#id-ul li");
 
    eButton.addEventListener("クリック", 関数() {
        newLi = document.createElement("li");
        eUl.appendChild(newLi);
        新しいLi.innerText = num++;
    })
 
    (eLiのeLi要素とする) {
        eLiElement.addEventListener("クリック",関数(イベント) {
            アラート(event.target.innerText);
        })
    }
 
</スクリプト>
 
</本文>
</html>

結果

元の要素のクリック イベントは処理されますが、新しく追加された要素は処理されないことがわかります。

これで、JavaScript イベント委譲の詳細な使用例に関するこの記事は終了です。JavaScript イベント委譲に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • JavaScript イベント委任の原則
  • jsイベント委譲の詳細な説明
  • JavaScript イベント委任の原則と使用例の分析
  • js イベント委任とイベントプロキシケース共有
  • jsイベントプロキシ(デリゲート)の詳しい説明
  • JS イベントバインディング、イベント監視、イベント委任の詳細

<<:  CSS3で作成した画像スクロール効果

>>:  Dockerコンテナのエクスポートとインポートの例

ブログ    

推薦する

WeChatアプレットのスクロールビューが左右連動効果を実現

WeChatアプレットはスクロールビューを使用して左右のリンクを実現します。参考までに、具体的な内容...

JavaScript はマウスのドラッグを実装して div のサイズを調整します

この記事では、マウスをドラッグしてdivのサイズを調整するJavaScriptの具体的なコードを参考...

MySQL thread_stack 接続スレッドの最適化

MySQL は、ネットワーク経由だけでなく、名前付きパイプ経由でも接続できます。MySQL への接続...

MycliはMySQLコマンドライン愛好家にとって必須のツールです

マイクリMyCLI は、自動補完と構文の強調表示を備えた MySQL、MariaDB、および Per...

JavaScriptがDOMツリーの構築にどのように影響するかについて詳しく説明します。

目次ドキュメント オブジェクト モデル (DOM) DOM と JavaScript DOMツリーの...

Centos7 での nginx のインストールと設定に関する詳細なチュートリアル

注: ソフトウェアのインストールの基本ディレクトリ パスは /usr/local です。ソフトウェア...

Vue3は独自のページングコンポーネントをカプセル化します

この記事の例では、vue3 が独自のページングコンポーネントをカプセル化する具体的なコードを参考まで...

同じ IP のアクセス頻度を制限するように nginx を設定する方法

1. nginx.conf の http{} に次のコードを追加します。 limit_conn_zo...

mysql5.7.21 utf8 エンコーディングの問題と Mac 環境での解決方法

1. 目標: mysql の character_set_server の値を latin1 から ...

ミニプログラムにより、製品属性の選択や仕様の選択が可能

この記事では、ミニプログラムで製品属性選択または仕様選択を実装するための具体的なコードを参考までに共...

Vue.js を学ぶ際に遭遇する落とし穴

目次クラス void のポイントES6 矢印関数ヴュートファイvue-cli非同期と同期実行と展開ヒ...

トランジションコンポーネントのアニメーション効果を使用した Vue サンプルコード

トランジションドキュメントアドレスは、フェードインとフェードアウト効果を実現するための背景ポップアッ...

テキストエリアタグはサイズ変更できず、マウスでドラッグすることもできません

テキストエリアタグのサイズは不変ですコードをコピーコードは次のとおりです。 <textarea...

Vue3 (III) ウェブサイトホームページレイアウト開発

目次1. はじめに2. 実際の事例1. App.vueを変更する2. レイアウトを調整する3. ジャ...

JavaScript データのフラット化の詳細な説明

目次フラット化とは何か再帰トストリング減らすアンダーコア_.平坦化_。連合_。違い要約するフラット化...