Javascript 优化jQuery选择器-哪个更快?

Javascript 优化jQuery选择器-哪个更快?,javascript,jquery,optimization,performance,Javascript,Jquery,Optimization,Performance,jQuery中的选择器或函数是否更快?例如: $('#something div.else'); // find multiple divs with class .else 或 我正在尽最大努力优化一个包含数百个返回元素的页面,这些元素似乎挂在办公室里某台破旧的计算机上,而这台计算机必须使用Internet Explorer::shudder::。在这种情况下,第二个更快,但它们并不等同。第一个查找任何子代div.else,另一个只查找div.else的直接子代 这取决于您的DOM,因为哪一

jQuery中的选择器或函数是否更快?例如:

$('#something div.else'); // find multiple divs with class .else


我正在尽最大努力优化一个包含数百个返回元素的页面,这些元素似乎挂在办公室里某台破旧的计算机上,而这台计算机必须使用Internet Explorer::shudder::。

在这种情况下,第二个更快,但它们并不等同。第一个查找任何子代div.else,另一个只查找div.else的直接子代

这取决于您的DOM,因为哪一个更快,第二个的等价物是:

$('#something > div.else');
这使用了。它们应该非常非常接近,而且在任何情况下,我怀疑从ID下降的选择器是您的问题区域,我认为您会发现您在JS中的绝大多数时间都花在了其他地方


对于诊断速度问题,可以使用分析器,特别是IE,有一个很棒的免费分析器叫做。抓住它,在他们的网站上……你会很快发现你在IE中的痛处。

虽然我没有检查jQuery代码,但我认为你的两个示例之间的差异应该是可以忽略的——尽管第一个示例应该运行得快一点

旧IE版本的问题在于,它们不支持基于类名获取项目的本机方式。在这种情况下,jQuery必须对包含的每个元素的每个类属性执行regulra表达式

在您的情况下,如果可能的话,当您能够选择一个不寻常的标记名时,您可能会获得相当多的性能:

$("#container blockquote.else")
理想情况下,去掉类名

编辑:刚刚看到尼克的答案,他是对的,那个骗子只需要检查直接的孩子。等效的第一个是:

$("#container > div.else")

在您的具体示例中,您的第一个

$('#something div.else');
通过在jQuery库中传递到的Sizzle进行优化

$('#something').find('div.else');
如果没有这种优化,它会变得更慢,因为选择器引擎的嘶嘶声是从右到左工作的。因此,它会将所有div与类else匹配,然后检查其中哪些div具有作为父类的内容

编辑

嘶嘶声优化速度较慢 不管怎么说,因为我花了一段时间 这项任务已经完成,而且还有一些进展 函数在途中被调用

一般来说,使用jQuery函数要快得多。例如,jQuerys.eq函数将使用数组切片来减少jQuery对象的wrappet集,而:eq选择器将调用sizzle


如果在您的示例中,div.else元素是某物的直接子元素,.children将击败.find-since.find还将查找所有子元素及其子元素。

如果我理解正确,您需要在IE6中以最快的方式获取div.else。由于jQuery使用Sizzle,它将首先查找所有div,然后使用else类进行过滤,并拥有一个具有something id的祖先

如果第二个示例包含的子对象很少,则速度会更快;如果包含的子对象较多,则速度会较慢


建议您尝试使用另一种标记类型,而不是div,一种在您的页面中没有使用的标记类型,比如blockquote。只要用css重置它的样式,使它看起来像一个普通的div,然后将选择器更改为blockquote.else,这应该会快很多。

jQuery会将这样的调用转换为$'something'。找到'div.else'。jAndy-不,不会。嘶嘶声!=jQuery:它们是分开的,是吗。效果是一样的,但它不会发出那种声音。如果你的意思是,它是等价的……好吧,还是不行,.children!=。好吧,我只是表达错了。Sizzle将检测选择器字符串中的第一件事是否是id,然后Sizzle将其转换为find语句。但是无论如何,它在jQuery源代码中,所以。。我从来没有说过。孩子===。找到anyways@jAndy-很公平,虽然我真的很困惑,如果你没有提到我的答案或问题,那么这样的呼叫意味着什么…因为没有任何代码可以这样翻译。确实,这很困惑,应该是Sizzle将把$'something div.else'优化为$'something'。find'div.else.jQuery没有进行此优化,它将选择器传递给Sizzle。$'其他的东西;转换为$document。查找'something div.else';,不是$'something'。找到'div.else';。jQuery不会像这样修补选择器。@Nick:嗯,我只是表达了我自己的错误。Sizzle将检测选择器字符串中的第一件事是否是id,然后Sizzle将其转换为find语句。但是无论如何,它在jQuery源代码中,所以..它不在源代码中,它是用jQuery构建的,但是Sizzle本身是一个单独的项目,包含在一些库中,您可以在这里找到它的源代码:对于转换,不管字符串的第一个是什么,任何空间分割都不包括特殊的选择器,例如>是一个。发现:当你谈论性能和优化时?当然,在这种情况下,事情发生在哪里非常重要。通常情况下,这一点都不重要,因为差别是无限的 simal,但当你谈论性能时,它直接关系到问题。
$('#something').find('div.else');