每当遇到这样的事情时,在jQuery中:
$("div#MyDiv").....
我通常会对开发人员说:“不要费心将div
放在#MyDiv
前面,ID选择器是最快的。”即。
$("#MyDiv")....
这是因为后者将直接挂钩到document.getElementById
,而不是首先扫描所有<div>
元素的DOM。
我的问题是,同样的规则适用于CSS选择器吗?即而不是:
div#MyDiv
{
}
简单地说是否更快?:
#MyDiv
{
}
(我知道CSS选择器无论如何都非常快,所以实际上两者都没有显着差异。)
非常感谢
修改
任何链接或引用可能对本讨论有用。谢谢: - )
答案 0 :(得分:11)
我会说 非常不可能 它会产生任何真实世界的差异。理论上,是的,只需要少一点检查(因为div#foo
确实需要div
来匹配选择器,根据the spec)。但它在现实世界的浏览器应用程序中产生任何真正差异的可能性?接近零。
那就是说,当我在HTML应用程序中看到像div#foo
这样的东西时,我总是畏缩。 HTML只有一个ID类型属性(id
),因此不需要进一步的限定。你使CSS选择器引擎(浏览器或jQuery)更难以理解你的意思,你使选择器变得脆弱(如果div
变成footer
,等等),当然你做让自己对一个stoopid选择器实现开放,该实现无法识别它可以通过ID查找内容然后然后检查它是否是{{1通过查看所有div
来查看。 (这样的实现是否存在?可能,你永远不会知道。)除了一些边缘情况,它总是让我觉得有人不太清楚他们在做什么。
所以对我而言,速度不是主要论点。毫无意义。 ; - )
答案 1 :(得分:2)
是的,因为解析速度更快,因为浏览器不能检查元素是否也是<div>
。 (对于一些规则,用户无法察觉速度差异)
答案 2 :(得分:2)
根据this Mozilla article,它确实有所作为,尽管只是一分钟。 (请注意,虽然该文章讨论了样式化XUL用户界面,但Gecko布局引擎使用两者来呈现Firefox的用户界面及其加载的网页。)
ID无论如何都要应用于DOM中的单个元素,因此尝试匹配标记名称所产生的性能损失完全没有必要,无论是否重要。更不用说它会在样式表中浪费几个字节。