コアポイント
on()
属性を使用して、どの要素がイベントをトリガーしたかを識別します。 event.target
を使用してバブルを停止できます。すべてのDOMイベントが伝播するわけではないことに注意してください。イベントデリゲートは、複数のイベントハンドラーを単一のイベントハンドラーに置き換えるため、メモリを使用するメモリが少なくなります。たとえば、10のリンクのリストにある各リンクにイベントハンドラーを添付すると、メモリスペースを取り付ける10のイベントハンドラーがあります。代わりに、イベントデリゲートを使用して親要素でイベントを処理する場合、各リンクに添付されたメモリよりも1つのイベントハンドラーのみが作成され、メモリが少なくなります。メモリ消費の削減に加えて、イベント委任には次の利点があります。
event.stopPropagation()
子猫の写真を販売する単一のページアプリケーションを開発しているとします。ページが読み込まれると、上位20個の子猫が表示されます。ユーザーがページを下にスクロールすると、より多くの子猫がロードされます。私たちのhtmlは次のようになります:
<div id="cats"> <ul> <li> <img src="/static/imghw/default1.png" data-src="https://img.php.cn/" class="lazy" alt=""/> <a href="https://www.php.cn/link/207f170979dd72ff5776e20d07c28732">More info</a> <button>Add to cart</button> </li> ... </ul> </div>
従来のイベント処理を使用して、イベントハンドラーを以下に接続する必要があります。
、loadImage()
、moreInfo()
、およびaddToCart()
関数の実装は提供されていないことに注意してください。 loadNewKittens()
$(document).ready(function() { var cats = $('#cats'); cats.find('img') .on('click', function() { loadImage(); }) cats.find('a') .on('click', function(event) { event.preventDefault(); moreInfo(); }); cats.find('button') .on('click', function() { addToCart(); }); $(window).scroll(function() { var fragment = loadNewKittens(); // 为新的DOM元素附加事件处理程序 fragment.find('img') .on('click', function() { loadImage(); }); fragment.find('a') .on('click', function(event) { event.preventDefault(); moreInfo(); }); fragment.find('button') .on('click', function() { addToCart(); }); fragment.appendTo('#cats ul'); }); });
$(document).ready(function() { $('#cats') .on('click', 'img, a, button', function(event) { event.preventDefault(); var target = event.target; switch(target.tagName.toLowerCase()) { case 'img': loadImage(); break; case 'a': moreInfo(); break; case 'button': addToCart(); break; default: // 什么也不做 } }); $(window).scroll(function() { var fragment = loadNewKittens(); fragment.appendTo('#cats ul'); }); });
にあります。ここでセレクターを渡すことにより、on()
は、直接バインドされたイベントハンドラーの代わりに、デリゲートイベントハンドラーを処理していることを知っています。イベント処理コードは今でははるかに簡単です。 on()
を取得し、そのevent.target
に基づいて切り替えることにより、どの要素がイベントをトリガーしたかを判断し、それに応じて応答できます。さらに、これらの新しい要素によってトリガーされたイベントが親要素に委任されるため、イベントハンドラーをtagName
にロードされた要素に接続する必要はなくなりました。イベントデリゲートを使用する際に注目すべき潜在的な「トラップ」は、デリゲートイベントハンドラーがトリガー$(window).scroll
の前に、子要素に接続されたすべてのイベントハンドラーが処理されることです。したがって、サブイベントのハンドラーはevent.stopPropagation()
false
この記事では、イベントの委任を研究します。私たちは、それが耐えなければならないイベントの処理負荷を減らすことにより、ウェブサイトのパフォーマンスを改善するのにどのように役立つかを見てきました。また、関数を介してjQueryにイベントデリゲートを実装する方法も見ました。
on()
jQueryイベント代表団についてよく尋ねられる質問
jqueryのイベント代表とは何ですか?なぜそれが重要なのですか? JQueryのイベント代表は、単一のイベントリスナーを親要素に添付できる手法です。これは、それらの子孫が現在存在するか、将来追加されているかにかかわらず、マッチングセレクターのすべての子孫を発射します。これは、アプリケーションに必要なイベントハンドラーの数を減らすことでパフォーマンスを大幅に改善できるため重要です。個々のイベントハンドラーを各要素に追加する代わりに、イベントを親要素に委任できます。これは、要素が動的に追加または削除される動的アプリケーションで特に役立ちます。
属性を使用して、どのチャイルド要素がイベントをトリガーしたかを判断できます。 event.target
.on()
メソッドは、イベントハンドラーを接続するために使用されます。イベントデリゲートの場合、イベントタイプ、子孫のフィルタリングに使用されるセレクター文字列、およびハンドラー機能の3つのパラメーターを使用します。イベントタイプは、イベントタイプ(「クリック」など)を表す文字列です。セレクター文字列は、イベントをトリガーする選択された要素の子孫をフィルタリングするために使用され、ハンドラー関数はイベントの場合に実行される関数ですトリガー。 .on()
イベントバブルとは何ですか?また、jQueryでのイベント代表団と何が関係していますか?
jQueryでのイベントの伝播を停止する方法は?
メソッドを使用して、jQueryでのイベントの伝播を停止できます。この方法により、イベントがDOMツリーに泡立つのを防ぐため、親ハンドラーがイベント通知を受信するのを防ぎます。ただし、コードをデバッグして理解するのが難しくなるため、注意して使用する必要があります。 .stopPropagation()
jQueryでのイベント処理に使用される
.bind()
.on()
jQueryの.bind()
など)またはイベント委任の親要素に直接接続できます。 .on()
メソッドはより一般的であり、jqueryにイベントハンドラーを添付するための好ましい方法です。 .bind()
はい、イベントデリゲートを使用して、jQueryのカスタムイベントを処理できます。標準イベントと同様に、イベントリスナーを親要素に添付することができます。これにより、子供のいずれかにトリガーされたカスタムイベントをキャプチャできます。
.off()
メソッドを使用して、jqueryのイベントハンドラーを削除できます。この方法は、すべてのイベントハンドラーを要素上のすべてのイベントハンドラーを削除するか、特定のイベントタイプまたは名前空間を備えたイベントハンドラーのみを削除することができます。
以上がjQueryとのイベント委任の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。