2009-08-19 93 views
2

一對夫婦的實際問題,這些選擇器中的哪一個可能會更快?

鑑於以下兩個將回到同一個結果集

$("#MyTable tr"); 
$("tr", "#MyTable"); 

有在使用父子CSS選擇器公約或指定上下文之間的任何性能差異而不是選擇?

另外,考慮到我可以保證一個tr將是一個表的直接孩子,這會改善上述表現嗎?

$("#MyTable>tr") 
+4

「因爲我可以保證TR將是一個表的直接子」 - 不要賭。瀏覽器應該(除了XHTML模式)暗示表和錶行之間的tbody元素。 – Quentin 2009-08-19 10:33:28

+0

@David Dorward - 公平的評論。雖然如果我們不能做出這個基本的假設,那麼不會產生這個選擇器,而.children()函數是多餘的? – 2009-08-19 10:43:12

+0

不需要。它只是意味着在處理含有隱式開始標記的元素時需要小心。人們通常不會將開始標籤包含在內的是tbody,只是明確表示它在那裏,您可以不用擔心。 – Quentin 2009-08-19 13:25:22

回答

3

$("#MyTable > tr")可能不實際工作,你應該有任何THEAD/TFOOT或TBODY作爲直接孩子的表格。我認爲FF /鉻等將新增TBODY爲你,所以選擇應該是

$("#MyTable > tbody > tr") 
+0

沒有看到Q ......的評論,但在此澄清 – redsquare 2009-08-19 10:55:02

+0

+1 - 我剛剛在FF中測試過,你說得對。 – karim79 2009-08-19 11:02:46

1

到目前爲止,最快的三個是:

$("#MyTable > tr") 

因爲你是選擇由編號的元素參考的直系後裔,所以選擇是很直接的。

編輯:@redsquare指出,上述功能不適用於Firefox和Chrome瀏覽器,因爲這些瀏覽器會將tbody元素附加到表格中。

背景選擇器被基本上轉化爲「查找」,所以最慢的第2的是:

$("tr", "#MyTable"); 

,因爲它被轉化成像這樣之前的任何選擇發生:

$('#MyTable').find('tr'); 

當然,如果你自己做基準測試,這可能對你有很大的好處。

這裏是以前問的SO一些相關的問題: