2011-07-27 32 views
1

我正在尋找有關Sizzle(jQuery)在內部運行選擇器時會做什麼的信息。理想情況下,要麼是完成了關於不同瀏覽器或處理方式的撰寫/博客文章的人,還是能夠爲各種瀏覽器解編選擇器的網站。具體來說,我有一個團隊,這是說的代碼我寫的是在非常大的數據集鎖定了IE7:尋找有關jQuery選擇器引擎(sizzle)的內部實現的信息

.find('.row:not(.row-0) .col-' + colN + ':not(.forbid-transfer)') 

而且它更改爲:

.find('.row:not(.row-0) .col-' + colN).filter(':not(.forbid-transfer)') 

修復的速度問題。

對我來說這是一個完整的跆拳道,因爲我認爲這兩個是在發動機內是相同的,但顯然事實並非如此。請注意,一切內的父容器是一個div,所以改變這個div.row... div.col....不應該加速任何事情。

+1

無關,但如果您發現性能沒有差異,我會推薦使用'.not()'而不是'filter(「:not()」)' – meagar

+0

*「我有一個團隊正在說代碼I寫的是在非常大的數據集上鎖定IE7「*步驟1:單獨複製你自己。我不得不承認我很難相信它。如果它不是選擇器中較早的':not',我會在某些瀏覽器上相信它,因爲如果不使用任何特殊的僞類,Sizzle將會遵循'querySelectorAll'。但是IE7沒有'querySelectorAll',並且你在其他地方使用':not',所以... –

+0

主要區別在於,在第一種情況下,瀏覽器將對更多元素進行雙類名測試,第二,因爲(我認爲)它從右向左工作。因此它會在檢查元素是否具有正確類型的「行」父元素之前檢查「.col-n」類和「禁止傳輸」類。在第二種情況下,在候選人名單被剔除之前,它不必擔心「禁止轉讓」。 – Pointy

回答

0

我敢打賭,

.find('.row:not(.row-0)').find('.col-' + colN).filter(':not(.forbid-transfer)') 

甚至會快於IE7,或許在支持 「querySelectorAll()」 瀏覽器沒有。即使如此,這取決於頁面的細節。