ホームページ ウェブフロントエンド jsチュートリアル javascript_javascript スキルにおけるイベント プロキシに関する予備調査

javascript_javascript スキルにおけるイベント プロキシに関する予備調査

May 16, 2016 pm 04:56 PM
javascript イベントエージェント

イベントは常に JavaScript で最も強力なオブジェクトの 1 つです。 JavaScript には、イベントを DOM ノードにバインドするための 2 つのメソッド、addEventListener とattachEvent が用意されています。jquery はイベントをさらにカプセル化し、さまざまなブラウザと互換性のあるバインド メソッドを提供します。今見てみると、この従来のイベント バインド方法には次の欠点があります。

1. 多くの EventHander をバインドする必要がある場合があります。

ページ内のテーブルに 100 行がある場合、クリック イベントを各行にバインドする必要があります。その場合、100 個の EventHandler をバインドする必要がありますが、これらのハンドラーを保存するためにより多くのメモリを作成する必要があるため、ページのパフォーマンスに大きな負担がかかります。

2. DOM ノードにバインドした後はイベントを追加できません。

ページ内のコードが次のとおりであるとします。

コードをコピーします コードは次のとおりです:

$( "#dv").bind('click',function(){alert('test');});
$(body).append('<div id= dv">test</ div>')

はクリック イベントをトリガーできません。

これら 2 つの問題を解決するために、JavaScript にはイベント プロキシが導入されました。まずはjsにおけるバブリングの仕組みを理解しましょう。


基本的にすべてのブラウザはイベント バブリングをサポートしています。 DOM ノードでイベントがトリガーされると、イベントはドキュメントのルート ノードまで伝播されます。すべてのノード イベントは最終的にドキュメント ルート ノードに配信されるため、イベントをドキュメント ルート ノード (ドキュメント ノード) に直接バインドし、event.target を使用してどのノードがイベントをトリガーしたかを判断すると、大幅にコストが削減されます。 EventHandler についてはどうでしょうか?

jquery の live メソッドは、この原則に基づいて公式に実装されています。 live の単純なバージョンを実装してみましょう:

コードをコピーしますコードは次のとおりです:

$.fn.mylive=function(eventType,fn){
var that=this.selector;
$(document).bind(eventType, function(event){
var match=$(event.target).closest(that)
if(match.length !== 0){
fn.apply($(event.target), [イベント ]);
}
})
}

$("#tb td").mylive('click',function(event){
alert(event.target.innerHTML);
});

var tb='<table id="tb">
<tr>
<td>最初の列</td>
<td>二列目</ td>
<td>3列目</td>
</tr>
</table>';
$("body").append(tb);


ライブ メソッドでは、イベントはドキュメント ノードにバインドされており、$(event.target).closest(that) は実際にイベントをトリガーした要素と一致します。デモでは、後で追加した各 TD にクリック イベントをバインドしました。別の TD をクリックすると、対応するテキスト プロンプト ボックスがポップアップすることがわかります。

ライブ方式は、前述した従来のイベント バインディング方式の 2 つの欠点を補います。しかし、ライブ方式にはまだ欠点があります。このコードを見てください:

コードをコピーします コードは次のとおりです:

$(" #tb td" ).mylive('click',function(event){
alert(event.target.innerHTML);
});

最初に全体を走査します。 jquery selector に基づいてドキュメントを作成し、すべての #tb td 要素を見つけてオブジェクトとして保存します。ただし、ライブ実装方法ではこれらのオブジェクトは使用せず、イベントソースと一致する文字列として「#td td」のみを使用します。これにより、不必要な消費が大幅に増加します。

では、この状況を改善する方法はあるのでしょうか?デリゲート プロキシ メソッドは jQuery で提供されており、ドキュメントだけでなく指定された要素へのイベントのバインドをサポートします。その原理を理解した上で、単純なバージョンのデリゲートを実装してみましょう:

コードをコピーします コードは次のとおりです:

$(body).append('<div id="dv"></div>');

$.fn.mydelegate=function(selector,eventType,fn){
$(this).bind(eventType,function(event){
var match=$(event.target).closest( selector);
if(match.length !== 0){
fn.apply($(event.target),[event]);
}
});
}

$("#dv").mydelegate('td','click',function(event){
alert(event.target.innerHTML);
});

var tb='<table id="tb">
<tr>
<td>最初の列</td>
<td>二列目</ td>
<td>3列目</td>
</tr>
</table>';
$("dv").append(tb);


mydeletage メソッドはすべての td オブジェクトを取得する必要はなく、イベントがバインドされている div オブジェクトを取得するだけで済みます。実行効率の点では、ライブ方式よりも優れています。

これは、イベント プロキシの原理を誰もが理解できるようにするための単なる紹介です。jquery での live と delegate の実装はさらに複雑です。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 Dec 17, 2023 pm 02:54 PM

WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法

WebSocket と JavaScript: リアルタイム監視システムを実装するための主要テクノロジー WebSocket と JavaScript: リアルタイム監視システムを実装するための主要テクノロジー Dec 17, 2023 pm 05:30 PM

WebSocket と JavaScript: リアルタイム監視システムを実装するための主要テクノロジー

WebSocketとJavaScriptを使ったオンライン予約システムの実装方法 WebSocketとJavaScriptを使ったオンライン予約システムの実装方法 Dec 17, 2023 am 09:39 AM

WebSocketとJavaScriptを使ったオンライン予約システムの実装方法

JavaScript と WebSocket を使用してリアルタイムのオンライン注文システムを実装する方法 JavaScript と WebSocket を使用してリアルタイムのオンライン注文システムを実装する方法 Dec 17, 2023 pm 12:09 PM

JavaScript と WebSocket を使用してリアルタイムのオンライン注文システムを実装する方法

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 Dec 17, 2023 pm 05:13 PM

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築

簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法 Jan 05, 2024 pm 06:08 PM

簡単な JavaScript チュートリアル: HTTP ステータス コードを取得する方法

JavaScript で HTTP ステータス コードを簡単に取得する方法 JavaScript で HTTP ステータス コードを簡単に取得する方法 Jan 05, 2024 pm 01:37 PM

JavaScript で HTTP ステータス コードを簡単に取得する方法

JavaScriptでinsertBeforeを使用する方法 JavaScriptでinsertBeforeを使用する方法 Nov 24, 2023 am 11:56 AM

JavaScriptでinsertBeforeを使用する方法

See all articles