4

セレクターでjQueryAPI呼び出しを連鎖させることにマイナスの影響はありますか?パフォーマンス、設計、メモリリークの影響を受けやすいというマイナスの影響は、私が特に興味を持っていることです。

したがって、次のようなステートメントを連鎖させることになります。

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

アプリケーションを前述の否定的な影響のいずれかに開いたままにしますか?

個人的にはjQuery式のチェーンに問題はありませんが、多くの人がチェーンをbashするのを見てきました。それを回避することの具体的なメリットがあるのか​​、それとも読みやすさの問題なのかを知りたいのです。個人的なスタイル。

4

2 に答える 2

4

連鎖は実際にはこれを行うよりも優れています:

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

そうすることで、jqueryが「プールにジャンプ」して私の要素を3回検索するので、注文をチェーンすると、プールが1回だけ検索されます(プールがDOMであることに注意してください:)

于 2012-04-07T15:01:29.327 に答える
2

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


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


たとえば、これを行うと...

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

... jQueryオブジェクトには、クラス".my_class"を持つ要素の祖先への参照が含まれるようになりました。".another_class"

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

jq_obj.end();

...これで、".my_class"選択した元の要素への参照ができました。これは、元の参照が維持されたことを意味します。


したがって、を呼び出した後、そこで.parents()停止した場合(を呼び出さなかった場合.end()、そのオブジェクトへのグローバル参照を保持している場合は、要素に加えてjq_objすべての要素への暗黙の参照があります。".my_class"".another_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"要素を参照している場合でも当てはまります。その理由は、プロパティが元のDOM選択を行ったjQueryオブジェクトを参照しているため、存続.prevObjectする限りノードが解放されることはないためです。jq_obj

于 2012-04-07T15:52:48.140 に答える