2016-12-09 17 views
4
for (i = 0; i < $('body > p font i').length; i++) { 
    current = [$('body > p font i').eq(index), $('body > p font i').eq(index).index('body > p font u, body > p font i')]; 
    getState(current[1]); 
} 

function getState(index) { 
    // Lookup the object's index, then crawl up until you find a match 
    while ($('body > p font u, body > p font i').eq(--index).filter('u').length == 0); 
    console.log($('body > p font u, body > p font i').eq(index).text()); 
} 

かなり簡単な質問です。私はセレクタのフィルタに対してjQueryの結果セットを反復しています。これは、一致するものが見つかるまで結果セットを上って行きます。なぜこのループは徐々に遅くなりますか?

このループが長く実行されるほど、遅くなり、指数関数的に大きくなります。あなたは高価な操作で各反復でDOMツリーにserachingさ

+4

あなたはその最初の行の末尾にセミコロンを持つことを意味しますか? –

+0

はい、一致する結果のインデックスを探したいと思います。説明のために事前にコードを追加しました。 – Thirk

+0

インデックスの代わりに 'i'を使います。 2行目+なぜ2番目の要素だけが必要な場合は配列に要素を格納しているのですか? – Mahi

答えて

2

、解決策はキャッシュです:

var nodes = $('body > p font i'); 
for (var i = 0, size = nodes.length; i < size; i++) { 
    current = [nodes.eq(index),nodes.eq(index).index('body > p font u, body > p font i')]; 
} 
+0

それは何度も何度もキャッシュしていますか? – Thirk

+0

@Thirk移動している場合は*戻る*リストの中で最初に1つのアイテム、2つ、3つなどをチェックするだけです。 –

+0

@kidwon何かがボディに要素を追加するとどうなりますか? – Mahi

関連する問題