jQueryの.delegate()
メソッドを使用すると、イベントがデリゲートハンドラで要素内で発生するたびに、どの要素がイベントを受け取ったかを判断するために同様のテストが行われる必要があるため、パフォーマンスが低下します。
.delegate()
を使用すると、個々のハンドラをすべての要素に割り当てる必要性が(おそらく)避けられるため、これはしばしば価値があります。
上記のコードでは、複数のハンドラを割り当てるオーバーヘッドがありますが、どのイベントを受信したかを確認するためにはテストする必要があります。
.delegate()
があなたが参照した質問には適切な選択肢だとは言いにくいが、個々のハンドラを割り当てて、if($(this).is('something'))
のテストを避ける方がはるかに良いだろう。
元のOPのコードの目的が要素型ごとに個別の機能を持ちながらも共通の機能の一部を共有していたのであれば、その共通の機能を独自の名前付き関数にロールして呼び出す方が良いでしょう。これははるかに効率的なアプローチです。
EDIT:
この例を見てみましょう。 span.target
とp.anothertaget
要素がハンドラを取得するとします。ご覧のとおり、コンテナにはいくつかの要素があります。
セレクタを使用して.click()
を割り当てると、いくつかの別々のイベントハンドラが発生します。
$('span.target').click(function() { /* do something with span */ });
$('p.anothertarget').click(function() { /* do something with p */ });
HTML
<div id='container'>
<span class='target'>click me</span> <!-- i get a handler -->
<div>i don't do anything</div>
<p class='anothertarget'>i get a click too</p> <!-- i get a handler -->
<span class='target'>click me</span> <!-- i get a handler -->
<div>i don't do anything</div>
<p class='anothertarget'>i get a click too</p> <!-- i get a handler -->
<span class='target'>click me</span> <!-- i get a handler -->
<div>i don't do anything</div>
<p class='anothertarget'>i get a click too</p> <!-- i get a handler -->
<span class='target'>click me</span> <!-- i get a handler -->
</div>
これは、jQueryのは、これらの要素のすべてのための個別の利きを管理する必要があることを意味します。これは欠点です。イベントを受け取ったものを見るためにセレクタを実行する必要はありません。それは常にあなたがp
とspan
ために別々の機能を使用すると仮定すると(this
で表されます。
を.delegate()
を使用して、あなただけのコンテナにハンドラを割り当てる。これは、トリガすべき要素の種類ごとに行われます
<p>
要素の場合は1つ、<span>
の場合はもう1つのハンドラが割り当てられています。これは明らかに必要なハンドラの量を減らしますが、費用はjQueryを実行する必要があることですそれぞれのイベントに対して.delegate()
に渡したセレクタcontainer
の内部で、のタイプがイベントを実際に受け取ったタイプのを参照してください。
だから、いくつかの譲歩とテイクがあります。
$('#container').delegate('span.target','click',function() { /* do something with span */ });
.delegate('p.anothertarget','click',function() { /* do something with p */ });
HTML
<div id='container'> <!-- i get a handler for the span.target -->
<!-- and for p.anothertarget -->
<span class='target'>click me</span>
<div>i don't do anything</div>
<p class='anothertarget'>i get a click too</p>
<span class='target'>click me</span>
<div>i don't do anything</div>
<p class='anothertarget'>i get a click too</p>
<span class='target'>click me</span>
<div>i don't do anything</div>
<p class='anothertarget'>i get a click too</p>
<span class='target'>click me</span>
</div>
以前の回答のコードで問題は、それが効果的に第二の非効率と(多くのハンドラが割り当てられている)第一の例の非効率性を組み合わせたことでした例(セレクターの実行)。それは私が両方の世界の中で最悪のことを意味していたものです。
のために適切なだ場合、あなたの質問は何ですか?あなたのためのタグタイプのハンドルの事を聞かせて編集:[OK]を、ちょうどそれを見た。 – pyvi
このシナリオでは、一意のIDを実装するのに費用がかからず、簡単にはできませんか? IE element1 is id = "clickA" element2 is id = "clickB"次に、属性IDを1回取得するだけで、セレクタに対するテストの問題は解決され、1つの関数を保持できます。 (もしあなたがこの仕様を打ち負かすことなく大丈夫なら、あなた自身の擬似属性、つまりmyattrib = "selectorA"を簡単に使うことができますが、実際には良くありませんが、まさにこの理由のために全面的に使用されています) –