直接イベントコールバック$(".aClass").on("click",function(){});
は要素に直接アタッチされるため、イベントが発生した場合、そのコールバックを直接呼び出すことができます。
委任されたイベントコールバック$(element).on("click",".aClass", function() {});
の場合、イベントのイベントコールバックはに添付されelement
ます。イベントコールバックがアタッチされた時点では、selector
パラメータは保存されているだけであり、jqueryはその時点で一致する要素の検索を行いません。このセレクターは、要素がイベントを受信したとき(直接またはイベントがdomをバブリングしているとき)にのみ使用されます。次に、jqueryは、イベントの発生元である要素がセレクターと一致するかどうかをチェックします。
そのため、このセレクターはできるだけシンプルに保つ必要があります。最初のjQueryは、イベントの発生元である要素に2番目のクラスがあるかどうかを確認するだけでよいため、のテストは.on("click", ".aClass", ...)
はるかに高速に実行できます。jQueryは他の条件もテストする必要があります。それが、可能な限り具体的にすることです。.on("click", ".foo div .bar .aClass", ...)
.aClass
、、およびめったに発生しないその他のイベントの場合、パフォーマンスへの影響に気付くことはありませclick
んmousedown
。のようにmouseup
短い間隔で呼び出されるイベントの場合、デリゲートを使用するのはおそらく最善ではありません。各イベントで、起点である要素がセレクターと一致するかどうかをjqueryでテストする必要があるためです。(ルートとして使用)keypress
mousemove
element
言及すべきもう1つの重要なことは、すべてのイベントがDOMをバブリングしているわけではないということです。たとえば、バブリングのある要素とバブリングしていない要素のイベントscroll
(少なくともクロムではない)。その他のイベントも、特定のブラウザまたはブラウザバージョンでバブルしないことが知られています。これらのイベントでは、デリゲートを使用することはできません。overflow: scroll
overflow: auto
だから、より良い選択は何ですか、まあそれは答えるのは簡単ではありません。デリゲートを使用していて、明確な場所でそれらを宣言しない場合、どの要素にコールバックがあるかを見つけるのが難しい場合があります。一方、DOMから要素を追加または削除することが多い非常に動的なページがある場合は、デリゲートを使用する方がはるかに簡単です。これは、必要なすべてのイベントコールバックが添付されていることに注意する必要がないためです。新しく追加された要素に。
直接およびデリゲートを使用する場合は、コールバックが呼び出される順序にも特別なものがあります。とを追加し$(".aClass").on("click", ...)
、ユーザーが最初に直接接続されたコールバック$(document).on("click",".aClass", ...)
を持つ要素をクリックすると、接続された場所、次に接続された順序で呼び出されます。.aClass
一致するデリゲートコールバックがアタッチされている順序で呼び出される場合、イベントはそのイベントをリッスンする次の要素までバブリングしています。その後、イベントはドキュメントに到達するまでバブリングを続けます。