2012-04-07 9 views
4

jQuery API呼び出しをセレクタに連鎖することに否定的な影響はありませんか?だから、 メモリリークにパフォーマンス、デザイン、感受性を扱う負の意味合いは私が特に興味を持っているものですjQueryセレクタを連想させることには何の悪影響がありますか?

、このような声明をチェーンになります。

$('.myElement').css('color','green') 
       .attr('title','My Element') 
       .click(function(){ console.log('clicked') }); 

は、のいずれかに開いているアプリケーションを残します前述の否定的な意味ですか?

私は個人的にjQuery式の連鎖に問題はありませんが、私は多くの人にbash chainingを見てきました。それを回避するという具体的なメリットがあるのか​​、それとも単なる読みやすさと個人的なスタイルの問題。あなたの注文を連鎖さそれだけになりますが、私の要素3回を探してjqueryの「プールへのジャンプ」をするだろうそうするので

$('.myElement').css('color','green') 
$('.myElement').attr('title','My Element') 
$('.myElement').click(function(){ console.log('clicked') }); 

+0

構文の影響をどのように受けることができないかはわかりませんが、あなたが尋ねるその他の悪影響は、特定のインタプリタ実装の弱点としてのみ可能であるようです。 –

+1

「たくさんの人々が連鎖する」=>参照? – Christophe

+0

私の仕事では、最近私はこの例も見てきました。私はそれらを掘り出すことができるかどうかを確かめるために、回答者が質問者に「連鎖をやめて、それがヒップスターがコードし、あなたの経験している問題の原因になっている」と語った最近の賞金の質問に確かめています。 – KodeKreachor

答えて

4

チェーンは、これを行うよりも、実際に優れています一度プールする(プールがDOMであることに気付く:)

+2

はい、連鎖があなたの例よりも優れていますが、連鎖しないことによって冗長なDOM選択を行う必要があることを暗示しています。 –

2

連鎖は、返されたオブジェクトのメソッドを呼び出すだけである。そこには本質的に良いことも悪いこともありません。それが好きな人もあれば、そうでない人もいます。


メモリリークに関して、jQueryはDOMトラバーサルを実行したときにキャッシュされたjQueryオブジェクトのセットを保持します。参照されたjQueryオブジェクトは同じことをするので、実際にはチェーンとはあまり関係ありませんが、オブジェクトへの永続参照を保持するとリークを引き起こす可能性があります。

var jq_obj = $('.my_class').parents('.another_class'); 

例えば


、あなたがこれを行う場合は... ... jQueryオブジェクトは今".another_class"クラスを持つ".my_class"要素の先祖への参照を持っています。

事は...あなたはこれを行うことができます

jq_obj.end(); 

です...そしてあなたは今、選択元".my_class"要素への参照を持っています。これは、元の参照が維持されたことを意味します。


ですから、そこ停止した場合、.parents()を呼び出した後.end()を呼び出していない)場合、あなたはそのjq_objオブジェクトへのグローバル参照を守れば、あなたは今、すべての暗黙的な参照を持っていると思います".another_class"要素に加えて、".my_class"要素。

このように、元の".my_class"要素のいずれかがDOMから削除された場合、それらの参照のためGCできません。


次に例を示します。

http://jsfiddle.net/aUEFc/

// select "my_class" then traverse to a parent 
var jq_obj = $('.my_class').parents('.another_class'); 

    // remove "my_class" elements from the DOM 
$('.my_class').remove(); 

    // see if we still have a reference to "my_class" elements 
var len = jq_obj.prevObject.filter('.my_class').length; 

len変数は".my_class"要素が除去されたにもかかわらず、選択された".my_class"要素の元の数であろう。

私たちのjq_objオブジェクトが".another_class"要素を参照していてもそうです。その理由は、.prevObjectプロパティが元のDOM選択を行ったjQueryオブジェクトを参照するため、jq_objが存続する限り、ノードは決して解放されないからです。

関連する問題