2013-06-20 14 views
10

jQuery on()メソッドのselectorの目的は何ですか?どのような状況ではjQuery on()セレクタ

は、

$("#fish").find(".button").on("click", function() { 
    // something 
}); 

$("#fish").on("click", ".button", function() { 
    // something 
}); 

たとえば、より良いですか?

私はjQuery documentionに見て、見つけた:

セレクタを省略するかnullであるされている場合は、イベントハンドラは、直接または直接バウンドと呼ばれています。このハンドラは、選択された要素でイベントが発生するたびに呼び出されます。要素に直接発生するか、子孫(内部)要素から発生するかに関係なく発生します。

セレクタが提供される場合、イベントハンドラは委任されたと呼ばれます。バインドされた要素でイベントが直接発生したときにハンドラが呼び出されるのではなく、セレクタに一致する子孫(内部要素)に対してのみハンドラが呼び出されます。 jQueryはイベントをイベントターゲットからハンドラがアタッチされている要素(つまり最も内側の要素から最も外側の要素)までバブリングし、セレクタに一致するそのパスに沿った任意の要素のハンドラを実行します。私が言ってで修正

アムは違いが私の最初の例では、イベントが#fishにバインドされていることであるが、2番目の例ではイベントがバインドされているのに対してのみ、.buttonsからバブルアップイベントをリッスンしていることそれぞれ.buttons?もしそうなら、これの意味は何ですか? :S

イベントが#fishにバインドされている場合、.buttonをクリックすると、クリックされた.buttonを知ることができますか?これは.buttonよりむしろ#fishを参照します。正しい?

+4

最初の例は、イベントがバインドされたとき、または将来、存在する '#fish'内の' .button'要素に対して機能します。 2番目の例では、バインド時に '#fish'内の' .button'要素に対してのみ関数を実行します。 – BenM

答えて

8

例1は、子孫が#fishである限り、動的に作成されるボタンのイベントをバインドします。バインド後に作成されたボタンにはクリックハンドラが呼び出されます。祖先要素を選択しない場合は、$(document)にバインドすることもできます。

例2は、バインディング時にDOMにあるボタンにのみバインドされます。ダイナミックに作成された要素は、ハンドラを受信しません。

両方の例では、this$(this)は、#fishではなく、クリックされたボタンを参照します。

このjsFiddleをデモ用にご覧ください。コンソールでthis#fishではないボタンを参照していることがわかります。

$('#fish').on('click', '.button', function(){ 
    console.log(this.id); 
}); 
3

はい、正しいです。セレクタでonメソッドを呼び出すと、委任されたイベントが作成されます。

$("#fish").on("click", ".button", function() { 

は同じん:イベント

$("#fish").delegate(".button", "click", function() { 

#fish要素にバインドされているが、それは唯一の.button要素のクリックのイベントハンドラを呼び出します。つまり、要素をバインドするときに.button要素が存在する必要はなく、#fish要素のみが存在する必要があります。

+0

イベントが '#fish'にバインドされている場合、' .button'をクリックすると、クリックされた '.button'を知ることができますか? 'this'は' .button'ではなく '#fish'を参照します。 – Valuk

+0

@Valukが間違っていると、 'this'は'#fish'ではなくボタンを参照します。 – MrCode

+0

@MrCode oh!私は、イベントハンドラが '#fish'にあると思っていたでしょう、それは' this'が言及していたものです。しかし、あなたは、「this」は最初にクリックされた要素を指していると言っていますか?イベントバブリングにもこれは当てはまりますか? – Valuk