2011-01-17 16 views
10

名前空間のカスタムイベントがjQueryでどのように動作するはずです。私はthe docから、名前空間付きのカスタムイベントを起動すると、そのイベントに固有のハンドラーしか起動しないという印象を受けました。代わりに、名前空間はほとんど無視されているようです。以下の例とライブコード:http://jsfiddle.net/kZCBw/1/名前空間カスタムイベントトリガー

$(document) 
     .bind("reset.one", function(){ console.log("reset.one event detected");}) 
     .bind("reset.two", function(){ console.log("reset.two event detected");}) 
     .bind("cheese", function(){ console.log("cheese event detected");}); 

     $("#btn1").click(function(){ 
      console.log("firing reset.one event"); 
      $(this).trigger("reset.one"); 
     }); 
     $("#btn2").click(function(){ 
      console.log("firing reset.two event"); 
      $(this).trigger("reset.two"); 
     }); 
     $("#btn3").click(function(){ 
      console.log("firing reset event"); 
      $(this).trigger("reset"); 
     }); 

     //btn1 click should only trigger handlers bound to "reset.one" 
     //and yet it triggers anything starting w/ "reset" 

私は何が欠けていますか?

ありがとうございます! -matt

+0

サイドノート:jQuery 2.1.4とjQuery 3.0でうまく動作します。 – ViRuSTriNiTy

答えて

11

私はあなたの例を少なくとも確かめることができます。

リスナー(http://jsfiddle.net/kZCBw/2/を参照)を使用すると、サンプルコードがドキュメントに反映され、期待どおりに機能します。

DOMツリーの上位に移動すると(http://jsfiddle.net/kZCBw/3/参照)、失敗します。

最初は、私は名前空間がイベントオブジェクトにバブルアップされていなかったので、これがあったと疑われたが、私は次のコード(http://jsfiddle.net/kZCBw/4/でのライブの例)追加:あなたが見ることができるように

$('*').bind('reset', function(e){ 
    console.log(e.type + '.' + e.namespace + ' detected at ' + e.currentTarget); 
}); 

を名前空間はうまくバブリングされています。

documentationでは、探している動作(上位レベルのDOMノードで有効な名前空間が残っています)が明示的に示されていませんが、名前空間のイベントの仕組みになるはずです。これまでのところ、「バグまたは機能」の検索を開始することができます。

jQueryのソースコードに触れることなく、あなたが探しているものを達成するためのヒントは、EventObjectを使用してイベントをフィルタリングすることです(これは、名前空間のイベントが最初の場所でjQueryでどのように行われるかと思われます)ハンドラ。

+0

+1 v良い答えです。テストする適切なプロパティは 'e.namespace'であることに注意してください。 – lonesomeday

+0

親切な言葉や有益なアドバイスのためにloneomedayに感謝します。 OPへの注記:[jQueryのドキュメント](http://api.jquery.com/category/events/event-object/)のEventObjectの使用方法に関するガイドを入手できます。代わりに、EventObjectインスタンスに 'e'が代入された' console.log(e) 'を入れるだけで、オブジェクトの非常に簡単な概要を知ることができ、オブジェクトの使い方を直感的に理解するのに役立ちます。 –

+0

Stevenとloneomedayに感謝します。もう少し掘り下げた後、これは既知の問題であることが判明しました。参照:http://bugs.jquery.com/ticket/6913したがって、今日は唯一のオプションは名前空間/クラス名をテストすることだと思われます – busticated