2012-03-07 15 views
27

ページ上の一部のコンテナに動的に追加される要素の条件付き操作を試行していますが、イベントがありません。私は簡単に動的要素の読み込み時のjQuery

$('#container').on('click', '.sub-element', function() { ... }); 

を使用して、すべての新しい要素のためのクリック機能にイベントハンドラをバインドでき

<div id="container"></div> 

しかし、私がためにに結合しない:

は、私がコンテナを持っていると言います要素が#containerに追加されたときに「ワンタイム」フックを取得します。私はreadyloadにバインドしようとしています。これを行う方法はありますか、私の問題の別の解決策を考えなければなりませんか?

This fiddle contains my non-working example

+1

*すべてのブラウザで、ロードイベントはバブルしません。 Internet Explorer 8以前では、ペーストイベントとリセットイベントはバブル処理されません。このようなイベントは、委譲ではサポートされていませんが、イベントハンドラがイベントを生成する要素に直接アタッチされている場合に使用できます。*(http://api.jquery.com/on/)その周りを回避する... – Corbin

+0

あなたは一緒に達成しようとしている '負荷'機能を削除する代わりに、アイテムが '連鎖'によって追加された後にHTMLを操作するのは問題でしょうか? $( '#container')。append( '

No worky!
').html( 'yaay!'); – Ohgodwhy

+0

@Ohgodwhy私は回避策を思い付くことができません(そして、このばかげた例のために)、私はちょうどあなたが私の目的のために使用できる私が逃したイベントがあるかどうかを知りたい記述。 –

答えて

31

あなたはjQueryのイベントハンドラによって、ピックアップすることができ、新たに追加されたDOM要素にカスタムイベントをトリガすることができます:ここで

//bind to our custom event for the `.sub-element` elements 
$('#container').on('custom-update', '.sub-element', function(){ 
    $(this).html('<b>yaay!</b>'); 
}); 

//append a new element to the container, 
//then select it, based on the knowledge that it is the last child of the container element, 
//and then trigger our custom event on the element 
$('#container').append('<div class="sub-element">No worky!</div>').children().last().trigger('custom-update'); 

はデモです:http://jsfiddle.net/ggHh7/4/

この方法は、あなたがすることができますさまざまな方法で動的コンテンツをロードしても、何かをグローバルに実行します。

更新

私はブラウザのサポートのわからないんだけど(私はIE8を仮定しますと古いがこれをサポートしていない)が、あなたはDOM要素が追加されたときに検出するDOMNodeInserted突然変異イベントを使用することができます。

ここで
$('#container').on('DOMNodeInserted', '.sub-element', function(){ 
    $(this).html('<b>yaay!</b>'); 
}) 

$('#container').append('<div class="sub-element">No worky!</div>'); 

デモです:http://jsfiddle.net/ggHh7/7/

UPDATE

THIのための新しいAPIがありますこの時点ではDOMNodeInsertedが償却されます。私はそれに見ていないが、それはMutationOvserverと呼ばれています:https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver

+0

興味深い、+1、すべて...あなたは、サードパーティ製のplugInが要素をいくつかのコンテナに追加したときに通知を受ける方法がないと言っています。私はそれを追加するものではない場合、私はねじ込まれていますか? –

+3

新しいDOM要素を頻繁にチェックする間隔を設定できます。 https://developer.mozilla.org/en/DOM_Client_Object_Cross-Reference/DOM_Events( '変異と突然変異を見てください:それ以外の変異イベントは' DOMNodeInserted'が何をしたい、おそらくですが、ブラウザのサポートは、何が必要ではないかもしれないが、そこにあります名前イベントタイプセクション)。 'DOMNodeInserted'の使用例はmy ** update **を参照してください。 – Jasper

+0

Long Pollingなどの方法を使用して長さの変更を監視し、長さが変更された場合はその長さの差を取得する必要があります。それはあなたにそこにある「物体」が何であれ、あなたに与えるでしょう。それは慣習的ではありませんが、うまくいくでしょう。 – Ohgodwhy

6

上記の答えを読んだ後、私は今、成功し、これを使用します。

$('body').on({ 
    DOMNodeInserted : function(){ 
     alert('I have been added dynamically'); 
    }, 
    click : function(){ 
     alert('I was clicked'); 
    }, 
    '.dynamicElements' 
}); 

それらがロードされているとして今、すべての私のdynamicElementsがものを行うことができ、利用します素晴らしい.on()イベントマップ。

関連する問題