2011-10-06 23 views
13

私は古いコードを見ています。私は、ajaxで追加される要素には、ライブクエリコードがたくさんあることがわかりました。 jqueryの新しいバージョンではライブクエリが不要になりましたか?誰もが正確にそれが必要ではないバージョンを知っていますか?livequeryは非推奨です

$("#somediv").livequery(function(){ 
    $(this).click(function(){ 

    }); 
}); 
+4

はい、livequeryが死んでいることを

$('body').on('click', '#obj', function() { ... }); $('body').on('DOMNodeInserted','#obj', function() { ... }); 

ノートになります。それはまた、反パターンです – Raynos

+1

@Raynos何がそれを置き換えますか?現在のところ、その目的に役立つ例は見つかりませんでした。 .onはイベント用であり、近いjqueryイベントはDOMNodeInsertedであり、これは広いブラウザサポートを持たない。 – AaronLS

+1

@AaronLSイベントの委任が問題を解決します。 'DOMNodeInserted'が必要な場合は、複雑なテンプレートシステムを構築するか、それを間違って実行してください。前者が単純なテンプレートシステムを構築するのであれば、代わりに – Raynos

答えて

11

livequery.live()とは全く異なる概念です。

.live()メソッドは、イベント委任を使用して、ページの任意の場所で発生するイベントを処理します。

livequeryは、DOM変更が発生したときにハンドラを呼び出します。(jQueryメソッド経由)

class="some_class"の要素がDOMに追加される(またはクラスが要素に追加される)場合、最初のハンドラが実行されます。削除されると、2番目の。

$('.some_class').livequery(function() { 

     // apply a plugin to the element 
    $(this).somePlugin(); 

}, function() { 

    // clean up after the element was removed 

}); 

livequeryのために少し実際必要があるはずですが、あなたはDOMの変化に対応する必要があり、それらの変更を引き起こしているのjQueryを制御することはできませんというまれなケースでは、それが役立つことがあります。

+0

@レイノス:私はそれを醜いと呼んでいませんが、私はほとんどいつも別のアプローチを提案しています。 – user113716

+0

これは_time period_ごとにdomを繰り返して変更を探します。基本的にDOMをポーリングし、血まみれの要素をすべてチェックし、何かが変更されたかどうかを確認します。信じられないほど計算量が多く、ちょっとばかげて、domの突然変異の事象を検出する機能もありません。 – Raynos

+7

@Raynos:私はちょうどソースを見て、簡単なテストを行い、 'livequery'の仕組みの説明は正しくありません。実際には、jQueryメソッドを元のコードを呼び出す前に内部コードを呼び出す関数でラップします。したがって、メソッドが呼び出されると、提供された元のセレクタに基づいてDOM選択が実行され、新しい要素が見つかった場合にコールバックが適用されます。だから、すべてのDOM要素のすべての時間帯にはポーリングがありません。 – user113716

2

on()を使用し、親または身体にイベントを添付する必要があります。例:

$('#obj').livequery('click', function() { ... }); 
$('#obj').livequery(function() { ... }); 

はDOMNodeInsertedは、IE9 +