3

のパフォーマンスに関して少し問題がありjQuery.showます。この問題は IE8 で発生します (おそらく以下のバージョンでも発生しますが、IE8 に興味があります)。

私はjQueryオブジェクトの配列を持っています。それを呼び出しましょうelements。私はそれらを見せたいので、私はしました:

for (var i = elements.length - 1; i >= 0; i--) {
    elements[i].show();
}

ボトルネックは への呼び出しのようshowです。配列はすでに生成されているので、時間はかかりません。配列のループも問題になりません。

showすべての要素を含む新しい jQuery 要素を作成することで、これを 1 回の呼び出しに減らすことを考えました。しかし、これを行う方法がわかりませんでした。でやってみましたjQuery.add

var $elements = elements[0];
for (var i = elements.length - 1; i >= 1; i--) {
     $elements = $elements.add(elements[i]);
}
$elements.show();

さて、今回は に問題がありそうjQuery.addです。おそらく、常に新しいオブジェクトを作成するためです。

そこで、私の問題を解決できる 3 つの異なるアプローチを考えました。多分あなたはそれらの1つで私を助けることができます:

  • add新しいオブジェクトを返さず、代わりに現在の jQuery 要素に追加するような jQuery メソッドはありますか?
  • jQuery要素の配列でjQuery要素を作成する簡単で迅速な方法はありますか?
  • show配列内のすべての jQuery オブジェクトをより高速に処理する方法はありますか?

質問の 1 つだけに答えるだけで、ここで私を助けることができるでしょう。私の問題は、jqueryがそのメソッドDOM elementsの配列ではなく、常に配列を期待していることです。jQuery elements

よろしくお願いします!

-- の内容について編集elements

ノード (つまり、li要素) を動的に作成する jstree があります。これらの要素には、data-idそれらを識別するための属性があります。これで、$('li[data-id=xxx]') のようなクエリをいつでも実行できますが、これは非常に遅くなります。代わりに、li要素が作成されると、それらをオブジェクトのような辞書にキャッシュします (キーはデータ ID、値はノードです)。このオブジェクトから、配列を生成しますelements。これは非常に高速に発生します。アレイのサイズは最大 4000 ノードです。配列内のすべての jQuery 要素には、DOM 要素 ( li) が 1 つだけ含まれます。

4

1 に答える 1

3

編集

あなたのアップデートとコメントを読んだ後、この非常に小さなワンライナーが答えになる可能性が最も高いです:

elements.each($.fn.show);

jQを使用して、各メソッドをすべての要素に適用します(内部的には:callが使用されます) 。show


jQueryオブジェクトの配列からjQueryオブジェクトを作成する最も簡単で最速の方法は、次のとおりです。

var objFromArr = $(jQarr);

これをコンソールでテストしました。

objFromArr = jQuery([jQuery('#wmd-input'),jQuery('#wmd-button-bar')]);
objFromArr.each(function()
{
    console.log(this);//logs a jQ object
    console.log(this[0]);//logs the DOMElement
});

しかし、そうは言っても、jQオブジェクトの配列であると言い ますが、それがセレクター( )の戻り値である場合、実際にはそうではありません。その場合、ループは「壊れています」elements$('.someClass')

elements = $('.someClass');
for (var i=0;i<elements.length;i++)
{
    console.log(elements[i]);//logs a DOMElement, not a jQuery object
}
//It's the same as doing:
console.log(elements[0]);
//or even:
console.log($('.someClass').get(0));

しかし、結局のところ、jQueryオブジェクトの配列があり、それらのすべてshowでメソッドを呼び出したい場合は、これが最善の策だと思います。

elements.each($.fn.show);//use the show method as callback
于 2012-10-17T09:08:44.480 に答える