jquery和CSS中最快的选择器方法 – ID或不?

jquery / javascript中最快的是什么?

$('#myID .myClass') 

要么

 $('.myClass') 

什么是最好在CSS中使用?

 #myID .myClass{} 

要么

 .myClass{} 

我现在看到我应该更好地解释。 抱歉!

Ofceauce ID是CSS和JavaScript中更快的选择器。 但有些时候你需要使用类,因为有多个选择器。

例如,我有我的大HTML文档。 在页面中间我有:

  

如果我想要定位所有“myClass”。 那么在定位类之前定位ID会更好吗? (然后我不必对整个HTML文档进行domtravel)例如:

这会是:

$( ‘#身份识别码’)。找到(” MyClass的)

要快于:

$(” MyClass的)

我对现代浏览器的测试表明你应该选择,

 $('#id').find('.class') // or $('.class') 

不是

 $('#id .class') 

原因是所有现代浏览器都实现getElementsByClassName导致按类名进行几乎恒定的时间查找(假设是哈希实现)。 哪些浏览器是现代的另一个主观问题。

它们在大多数现代浏览器中大致相同,因为类名在内部进行哈希处理。 不同之处在于旧版浏览器没有.getElementsByClassName或等效方法,因此.myClass在内部被解析为jQuery,并且dom中的每个元素.myClass.myClass并检查了类名(或者它在可能的情况下使用XPath)。

总是尝试尽可能使用#myID .myClass ,因为它允许jQuery直接跳转到#myID并在必要时从那里遍历。

让我们暂时从逻辑上思考这一点,假装你不知道浏览器是如何在内部构建的,或者它是如何访问DOM的,但你认为无论它做什么都是合乎逻辑的。

因此,在两个选择器中,最窄的选择器是否能够更快地找到结果?

你有两个选择器,翻译成粗糙的英语

  1. myClass类的任何元素,它是ID为myID的元素的子元素
  2. myClass类的任何元素

至于“什么是最好在CSS中使用”,这是完全主观的,因为它取决于你是否打算定位.myClass 所有实例或只是那些#myID#myID

好的问题其实。

假设您已经解析了D个最大深度的N个元素和S个规则的CSS的DOM。 然后,为所有元素找到样式的任务具有大致为O(N*D*S)计算复杂度。

显然,并非所有CSS选择器都具有相同的计算复杂度。

例如, li.item选择器和li[class ~= "item"]需要完全相同的CPU资源。 li[class = "item"]可以更快地计算,因为它不需要扫描空格。

#1选择器在这里:

 #myID .myClass{} /* #1 */ .myClass{} /* #2 */ 

需要更多的CPU资源,因为您需要完成与情况#2完全相同的工作量,您需要扫描父/子链(最多D个元素)以找到具有“myID”的元素。

这完全是关于纯CSS选择器。

在jQuery和朋友的情况可能会有点不同。 从理论上讲,jQuery引擎可以使用document.getElementById()来最小化查找集(因此减少N数),但这与CSS行为不匹配。 这是一个例子: http : //jsfiddle.net/dnsUF/ 。 这里jQuery用#foo报告一个元素,但实际上有两个这样的元素。

恢复:

  • 在CSS案例#2中更快
  • 在jQuery案例#1中可以更快(但在CSS意义上技术上可能不正确)。

这是我关于CSS选择器复杂性的文章: http : //www.terrainformatica.com/2008/07/csss-and-computational-complexity-of-selectors/这是如何通过使用样式集来改进它: http: //www.terrainformatica.com/2010/09/style-sets-in-h-smile-core/

ID始终是访问元素的最快方式,因为它们是唯一的。

是的,id是访问元素的最快方法之一。 看看这个测试http://mootools.net/slickspeed/ 。

假设您有许多应用.myClass元素, #myID .myClass绝对是访问该元素的更好方法。

更新 – 2015年 – 在这里检查自己
https://jsperf.com/id-vs-class-vs-tag-selectors/2

TL; DR;

使用ID $(“#foo”)比我在linux 64bits上的chrome 41上的CSS $(“。bar”)快4倍