在#C上使用E#C CSS选择器是否有任何性能优势?

时间:2012-10-24 18:46:43

标签: jquery performance jquery-selectors

我正在阅读jQuery以填补知识空白。

查看各种CSS选择器,我看到: -

  • #C(ID为C的任何元素)

    $('#profile')
    
  • E#C(任何类型为E且ID为#C的元素)。

    $('div#profile')
    

我知道特殊性在CSS规则的应用中是一个大问题,但鉴于在页面上有重复ID是不好的做法,我想知道为什么第二种形式存在以及如何在jQuery中处理它。 / p>

在询问DOM时,它是否会带来性能优势? (即立即限制选择的范围)。这个问题主要适用于jQuery,但我也有兴趣知道它是否与渲染引擎等有关。

2 个答案:

答案 0 :(得分:3)

jQuery有一个specialized "fast path"来处理#C形式的选择器,其中包含直接document.getElementById。表单E#C的选择器不由此路径处理,而是委托给Sizzle库。

因此,我没有看到E#C如何在实践中提供任何性能优势,而理论上也没有理由提供更好的性能。实际上,E#C要慢得多; see the massive performance difference here¹。

也就是说,E#C选择器当然更具限制性,因此无论选择是由jQuery还是其他媒介完成,两者的行为都会有所不同。即便如此,我从未使用过E#C(或者看过它);我想不出有什么理由在不同的页面上重用id。


¹在现实生活中,选择器不会在循环中运行,因此性能差异无关紧要。

答案 1 :(得分:2)

jQuery使用自下而上的搜索。它从最后一个选择器开始并过滤。

示例:

$('#id1 .class1 .class2')查找class2的所有类,然后筛选出父类为class1的所有类的结果,然后使用id为id1的父进程进一步过滤

$('#profile')和$('div#profile')基本相同,大约是ms的一小部分。但是了解性能优势以及如何正确地遍历DOM是很好的。