2010-01-25 24 views
9

這更多的是好奇心問題。當執行以下操作:選擇多個項目時的jQuery性能

$('.selector1, .selector2').doSomething() 

jQuery的是否完全遍歷DOM兩次獲得各組的每個選擇匹配的對象,或者是尋找在DOM的一個遍歷所有元素?

+0

我不這麼認爲,因爲從核心中看到的匹配是用各種節點屬性(nodeName,NodeType,id等)的正則表達式完成的。所以任何一個選擇器都會產生一次DOM迭代。但是,我不是100%正面的,所以我會推遲到其他人更熟悉內部:-) – prodigitalson 2010-01-25 23:27:28

+0

實際上這個例子是壞的,因爲''節點不存在於HTML :) – 2010-01-26 08:38:11

+0

我認爲你想要做的是找出選擇器引擎Sizzle,你可以看看它的源代碼:http://github.com/jeresig/sizzle/ http://github.com/jeresig/sizzle/blob/master/sizzle.js – artlung 2010-01-26 14:46:42

回答

1

我覺得它採用原生瀏覽器的功能來找到它,使用:

document.getElementsByClassName() 
1

這真的取決於瀏覽器。在較新的瀏覽器中,它將使用document.querySelectorAll來處理任何DOM查詢(在這種情況下,這會爲類調用document.getElementsByClassName)。在不支持這一點的舊版瀏覽器中,它必須自行計算出來,這顯然會變慢。

一般而言,您應該首選按id搜索內容(或者至少縮小範圍)。類和標籤名稱將是下一個速度。基本上,本地支持的DOM操作是最好的。

+0

這聽起來像是在大多數情況下,它會每次遍歷每個選擇器的DOM。儘管遍歷DOM的方式會根據選擇器的類型(元素對ID還是類)而有所不同? – 2010-01-26 20:39:18

+0

是的,它將使用正則表達式來分割所有查詢,並一次執行一個查詢。不過,我不擔心類或ID的性能。 – 2010-01-26 20:55:12