2011-10-13 47 views
5

這個問題與表現有關。jQuery會在篩選器中篩選其他參數之前搜索ID嗎?

如果我使用如下

$('#myID a') // Does this find #myID and filter by a? 

或者我應該寫這樣的語句選擇?

$('#myID').find('a') 

我不知道是否jQuery是足夠聰明的執行使用ID第一或者如果它的運作完全一樣的CSS和讀取從右到左的這一說法。使用標籤並不是什麼大不了的,但是當你運行類似

$('#myID .myClass') 

它在性能上有很大的不同。

+1

是什麼樣子在你的例子是,你要找到那麼將所有元件基於ID過濾。 '$('a#myID)'是我會這樣做的方式。它將選擇具有myID ID的錨標籤。鍵入它爲'$('#myID a')'實際上會選擇myID的所有子標記。 – PCasagrande

+0

的確,我在事故中忽略了.children()。它的意思是通過id獲取父元素,然後篩選孩子尋找錨點。 – THEtheChad

回答

6

從NETTUTS文章:http://net.tutsplus.com/tutorials/javascript-ajax/quick-tip-think-right-to-left-with-jquery/

舉個例子,如果灒遇到類似$選擇器(「#箱P」), 這是真的,它的工作原理從右到左,但有也是一個快速的正則表達式 優化,將首先確定 選擇器的第一部分是否是一個id。如果是這樣,它將使用該作爲上下文,當 搜索段落標記。從SizzleJS

相關評論:

// Take a shortcut and set the context if the root selector is an ID 
// (but not if it'll be faster if the inner selector is an ID) 
3

當Id在選擇器中時。 jQuery將首先執行document.getElementById,然後開始過濾子元素。

基本上這就是爲什麼只使用屬性或類選擇器$('.someclass') or $('[name=myname]')而不是更具體的原因。因爲它會導致代碼遍歷DOM並查看每個元素以找到該類。

只需將標記名添加到相同的選擇器$('div.someclass') or $('div.[name=myname]')即可提高效率,因爲它會首先運行。 document.getElementsByTagName縮小要搜索的元素數量。