2010-08-18 59 views
6

在jQuery中,選擇器$('[id = foo]')效率低於$('#foo')

回答

16
  • 簡而言之:

  • 長的故事(仍低於實際)

    $('[id=foo]') 
    

    使用灒(CSS查詢引擎)來選擇元素,而

    $('#foo') 
    

    直接調用getElementById

爲了有一個很長的故事,在這裏我們去:$('[id=foo]')$('*:[id=foo]')的代名詞,它使用通用選擇。這意味着,它會在您的標記中查詢所有節點,然後查看其中哪些具有id === foo(然後希望僅匹配一個元素,ID =唯一)。當然,這是昂貴的,相當昂貴。這就是爲什麼你永遠不會寫這樣的選擇器! 總是完全符合這個如果可能的話,就像$('span:[id=foo]')

+0

啊繼承人子的問題 - 是'$ ('span:[id = foo]')'只是'$(span#foo)'或者一個不同的選擇器的簡寫? – HurnsMobile 2010-08-18 17:44:12

+0

@HurnsMobile:完全沒有。 '$( '跨度:[ID = FOO]')'。我其實會建議在這裏查看jQuery init代碼。 jQuery確實將一些選擇器表達式解析爲直接調用'getElementById'或'getElementsByTagName',我認爲'$(span#foo)'就是其中之一。所以它比'$('span:[id = foo]')'快得多。這種表達會進入Sizzle,並且明顯需要比上述方法中的一種更長的時間。 – jAndy 2010-08-18 20:06:03

+0

非常豐富,非常感謝。我考慮使用除$(「#foo」)之外的東西來定位一個id的原因是因爲我定位的id有一段時間,這顯然是有問題的,因爲jQuery會將其解釋爲一個id和一個類。所以通過使用$(「[id = Address.State]」),我可以解決這個問題。解決這個問題的另一種方法是在$(「#Address \\。State」)中加倍逃避期限,但我認爲雙重轉義可能不太可讀。但是,考慮到您指出的效率損失,無論如何我可能會使用它。 – jbyrd 2010-08-18 21:18:41

1

是的。

jQuery中最快的選擇是ID選擇$(「#富」),因爲它直接映射到一個本地JavaScript函數getElementByID()的,那麼你jAndy

相關問題