2014-01-27 80 views
1

我有一個場景,我知道我正在尋找的div完全是兩層。Jquery - .children()。children()vs .find()

它是更有效地使用:

$('#mydiv').find('.myselector') 

$('#mydiv').children().children('.myselector') 
+2

你試過了嗎?不應該難以分析... – Constantinius

+2

溝渠jQuery更高效。如果你正在尋找效率,你應該一直這樣做。 – bjb568

+1

準備一個測試,讓人們檢查! http://jsperf.com/ –

回答

6

使用您的控制檯進行檢查。首先檢查你的第一個建議:

console.time('benchmark'); 
for (var i=0; i<1000; i++) { 
    var $elem = $('#mydiv').find('.myselector'); 
} 
console.timeEnd('benchmark'); 

現在做同樣的你的第二個建議:

console.time('benchmark'); 
for (var i=0; i<1000; i++) { 
    var $elem = $('#mydiv').children().children('.myselector'); 
} 
console.timeEnd('benchmark'); 

運行兩個版本幾次真正檢查是否有顯著差異。使用這種測試方法來優化您的選擇器。

+0

謝謝..完全消隱試圖!剛剛運行它和.children()。children()花了160毫秒或更多和.find ()每次少於10ms!我會用.find() – ForOhFor

+0

很酷;你是否也嘗試過@Niet the Dark Absol的香草JS版本?只是好奇它有多快... – meavo

+1

只是在一個側面說明中,我找不到它,但是有一個非常好的jsPerf,用於比較jQuery中不同的選擇器方法,'find()'幾乎總是最快的。此外,'.filter()'往往比使用僞選擇器更快。 – talemyn

1

試試這個:

var elems = document.getElementById('mydiv').querySelectorAll(".myselector"); 

的jQuery A comparison與幾個Vanilla JS想法,我有。


編輯:對於IE7支持:

var container = document.getElementById('mydiv'), elems = [], 
    firstlevel = container.children, l = firstlevel.length, 
    secondlevel, m, i, j; 
for(i=0; i<l; i++) { 
    secondlevel = firstlevel[i].children; 
    m = secondlevel.length; 
    for(j=0; j<m; j++) { 
     if(secondlevel[j].className.match(/\bmyselector\b/)) { 
      elems.push(secondlevel[j]); 
     } 
    } 
} 

...是啊,不漂亮!但仍然比jQuery更快!

+0

我不認爲他想要一個JS答案在這裏......根據標題,OP想要使用jQuery,而不是純JS – FastTrack

+4

@FastTrack那麼這只是愚蠢的,在我看來:p然後,我發現jQuery是愚蠢的:如果你不'如果你知道Vanilla JS,那麼你不應該使用這樣的工具,如果你知道Vanilla JS,那麼你不需要*這樣的工具。 –

+2

@NiettheDarkAbsol - 你忘了「現在離開我的草坪,你討厭的孩子!「;) – talemyn