2012-03-20 7 views
6

私は何をしようとしているの簡易版であるカスタムイベントに対してグローバルに聞く:jQueryのは、次のように

var indication = $('#some-div'); 
indication.bind('custom-event', function() { ... } 


// ... later on! 

function OtherThing() { 
    $(this).trigger('custom-event'); 
} 

私は2つを明示的に知っていることなく、function OtherThingからのトリガを受信するindication.bind('custom-event')を希望お互い。これは可能ですか?これまでの私の唯一の解決策は、リスナーとイベントの両方をボディにバインドすることです...これはうんざりしているようです - より良い方法がありますか?

+0

何「2人が明白に互いを知ることなく」という意味ですか? –

+0

@RobW - それをもっと説明し、コードを読んでいないかどうかわかりません...私は '$(this).trigger'を' $( '#some-div).trigger'に変更して動作させることができますそれは目的を破るものです。私の現在の解決策は、リスナとエミッタの両方を '$( 'body')' – Will

答えて

18

JavaScriptでは、各HTML要素でトリガーされたイベントは親に伝播されるため、問題を解決して何かを間違えることなくカスタムイベントを処理できるようにします。$('*').bind('custom-event')はリスナーをbodyまたはhtmlの要素:

したがって、イベントをbodyまたはhtml要素にバインドする必要があります。次に、選択された親要素内の任意の要素がカスタムイベントをトリガすると、この親要素に伝播されます。

そして、イベントハンドラでは、イベントオブジェクトのtarget属性にアクセスすることで、イベントをトリガした要素にアクセスすることができますので、event.target

を、コードは次のようになります。

$('body').bind('custom-event', function(e){ 
    var $element = e.target; 
}); 

$('#anyElement').trigger('custom-event'); 
+3

にバインドすることです。イベントを '' body''ではなく 'document'にバインドする方がよいでしょう。また、要素がドキュメントの一部ではない場合(たとえば、挿入されていないiframeなど)は機能しません。 –

+0

そうです、@RobW。要素が親要素の同じ文書の一部でない場合、その要素にはイベントが伝播しません。 –

+1

この偉大な答えをありがとう - それも私を助けた。 – carousel