2009-08-19 97 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一些相关的问题: