CSS和jQuery Selector Speed

时间:2010-11-04 08:47:06

标签: jquery css jquery-selectors css-selectors

每当遇到这样的事情时,在jQuery中:

$("div#MyDiv").....

我通常会对开发人员说:“不要费心将div放在#MyDiv前面,ID选择器是最快的。”即。

$("#MyDiv")....

这是因为后者将直接挂钩到document.getElementById,而不是首先扫描所有<div>元素的DOM。

我的问题是,同样的规则适用于CSS选择器吗?即而不是:

div#MyDiv
{
}

简单地说是否更快?:

#MyDiv
{
}

(我知道CSS选择器无论如何都非常快,所以实际上两者都没有显着差异。)

非常感谢

修改

任何链接或引用可能对本讨论有用。谢谢: - )

3 个答案:

答案 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中的单个元素,因此尝试匹配标记名称所产生的性能损失完全没有必要,无论是否重要。更不用说它会在样式表中浪费几个字节。