2012-10-04 2 views
26

委任されたイベントハンドラを手動でトリガするjQueryの方法はありますか?jQueryを使用して委任されたイベントを手動でトリガーするにはどうすればよいですか?

テイク次のコード例:

<div class="container"> 
    <input type="button" value="Hello"> 
    <span class="output"></span> 
</div> 
​ 
<script> 
    $('.container') 
    .on('click', '[type=button]', function(e) { 
     $(e.delegateTarget).find('.output').text($(this).val()); 
    }) 
    .find('[type=button]').triggerHandler('click');​ 
</script> 

(オンライン:http://jsfiddle.net/TcHBE/

私は、これがうまくいくことを期待していた、とテキスト「こんにちは」、実際にボタンをクリックせずにスパンに表示されますが、それはしません。

.ouput要素は、.containerの中のいくつかの場所以外のボタンとは関係がないため、ハンドラ内でe.delegateTargetを使用しています。そのため、私は委任イベントハンドラを最初に使用しています。

更新:イベントは、私が引き金にしたくない実際のコードでデフォルトの動作を持っているので、

また、私は、triggerHandlerを使用しています。 (実際のコードでは、イベントはのカスタムイベントhideですが、実際にはページのロード時にイベントハンドラをトリガするときにモーダルを非表示にしたくありません)。

ハンドラを名前付き関数に抽出して直接呼び出すことができますが、e.delegateTargetを使用すると、how構造が複雑になります。

+0

実際の問題を示すコードを更新してください。他のイベントハンドラやデフォルトアクションが実行されないようにすることは、明確ではありません。 – Prinzhorn

答えて

46

イベントオブジェクトを手動で作成し、それに応じてtargetプロパティを設定して、jQueryをトリックしてイベントがバブリングされたと考えるようにすることができます。 .on()方法で

var c = $('#container'); 

c.on('click', '[type=button]', function(e) { 
    $(e.delegateTarget).find('span').text($(this).val()); 
}); 

var event = jQuery.Event('click'); 
event.target = c.find('[type=button]')[0]; 

c.trigger(event); 

http://jsfiddle.net/PCLFx/

+20

数ヶ月後に戻ってきて実際にこれを自分で必要としています;-) – Prinzhorn

+0

スケーラブルな文書化されていないAPIを使ってイベントハンドラ関数を取得するよりも良い方法です。 – wberry

+0

'Event.target読み取り専用' ソース:https://developer.mozilla.org/en/US/docs/Web/API/Event –

0

セレクタはオプションです。
あなたが書く:

$('.container') 
    .on('click', '[type=button]', function(e) { 
     $(e.delegateTarget).find('.output').text($(this).val()); 
    }) 
    .find('[type=button]').triggerHandler('click');​ 

あなたが唯一のコンテナ内のボタンのクリックを聞くためにイベントハンドラを言っています。
$(e.delegateTarget)は、外部コンテナへの参照に過ぎません。

your fiddle to echo thisを更新しました。

これは引用from the API:

セレクタが設けられている場合、イベント・ハンドラが委任 と呼ばれています。イベントが直接バインドされた要素の に発生したときにはハンドラは呼び出されませんが、 がセレクタに一致する子孫(内部要素)に対してのみハンドラが呼び出されます。 jQueryは、イベントターゲットからイベントターゲット までのイベントを、ハンドラがアタッチされている要素(すなわち、最も内側の要素の の最も内側)に吹き込み、セレクタに一致する パスに沿った任意の要素のハンドラを実行します。

+2

この編集は、コードの意図/目的を変更することがあります。このコードにセレクタ '[type = button]'を含めると**ページが読み込まれた後にDOM **に追加されるボタンにイベントがアタッチされます。セレクタを削除すると、動的に追加されたボタンはクリックされたときにその機能を起動しません。 –

+0

@NoahWhitmoreありがとうございました。それは重要な言及です。私は4次元についてすべてを忘れていました。 :) – bldoron

関連する問題