我正在阅读jQuery以填补知识空白。
查看各种CSS选择器,我看到: -
#C
(ID为C的任何元素)
$('#profile')
E#C
(任何类型为E且ID为#C的元素)。
$('div#profile')
我知道特殊性在CSS规则的应用中是一个大问题,但鉴于在页面上有重复ID是不好的做法,我想知道为什么第二种形式存在以及如何在jQuery中处理它。 / p>
在询问DOM时,它是否会带来性能优势? (即立即限制选择的范围)。这个问题主要适用于jQuery,但我也有兴趣知道它是否与渲染引擎等有关。
答案 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是很好的。