2017-08-31 13 views
1

は、次の点を考慮するためにイベントをバインドするための最良の方法:はJQuery:動的に作成された要素

var template = '<div class="dynamic">Some markup</div>' 
    , $template = $(template); 
$template.on('click.namespace.data-api', function(e) { doStuff() }); 
$('div.#parent').append($template); 

私にはイベントが接続されているので、これは、ノードにイベントをバインドするための最も最適な方法であると思われますすでにjQueryオブジェクトとして導入されているノード。しかし、私は実際のクリックイベント中にこれがどのように働くのか分かりません。 jQueryはイベントがjQueryオブジェクトにバインドされているので、すぐにこの要素を見つけることができますか? 。

var template = '<div class="dynamic">Some markup</div>' 
    , $template = $(template); 
$('div.#parent').append($template); 
$('div.#parent').on('click.namespace.data-api', 'div.dynamic', function(e) { doStuff() }); 
+2

これらのコードスニペットでは異なることがあるので、私はあなたが何を求めているのか分かりません。最初は新しい要素を作成し、それをページに追加します。これは2番目の要素では行いません。これらはまた、異なる要素にクリックハンドラを追加します(おそらく、同じ効果が観察されます)。あなたが2つの理由を比較しているのかどうか、それは私には分かりません。 – David

+1

jQueryは、DOMにまだ挿入されていないにもかかわらず、このケースではフラグメント(これはあなたの '$ template'です)に' .on() 'を介してクリックイベントリスナーをバインドすることをサポートしています:https://github.com/jquery /api.jquery.com/issues/548 – Terry

+0

@David、わかりやすくするために更新しました。 2番目の例では、 'div.dynamic'子ノードのクリックをリッスンする親ノードにハンドラを追加します。 –

答えて

2

jQueryのが唯一の彼らはしている正確なコールに固執オブジェクトとしてすぐにその呼び出しは、もはやjQueryオブジェクトとして関連しているオブジェクトを行われているように:またはそれはより最適なようなものを使用してイベントをバインドすることです。

Click Delegationで表示しているように、ハンドラが親ノードにフックされ、委任された要素/クラスのクリックを監視するため、いつでも作成される要素の動的な側面について心配する必要はありません。

私に直接委任方法を使用してクリック委任の2番目のバージョンを書くことは、はるかに読みやすく、将来再読み込みに戻るときにはっきりします。

+1

バニラのJavaScriptを個人的に好むかもしれませんが、jQueryについて質問しているようです。あなたの答えの残りの部分が問題に取り組んでいることは、本当にはっきりしていません。 – David

+0

David - それは私の間違いでした。$( "div#parent")click( "on"、 "delegation")が使用されたかのように2番目の使い方を読みました。 –

-1

イベントを特定の要素にバインドする代わりに、代わりにドキュメントにバインドすることができます。

`$('.dynamic').click()` can be replaced with `$(document).on('click', '.dynamic', function())` 
+0

問題のコードは、既にイベントの委任を使用しています。注意深い観察者は、 '.click()'関数の呼び出しがないことを知ります。 – David

+2

また、イベントリスナーを 'document'に添付することはお勧めできません。なぜなら、jQueryは、バブリングのパス内のすべての要素とイベントを比較しなければならないため、パフォーマンスが大幅に低下します。 – Terry

関連する問題