改善jQuery选择器性能的好方法?

JC *_*bbs 74 javascript performance jquery css-selectors

我正在寻找任何可以改善jQuery调用的选择器性能的方法.特别是这样的事情:

$("div.myclass")不是快$(".myclass")

我认为它可能是,但我不知道jQuery是否足够聪明,首先限制标签名称的搜索等等.任何人对如何制定jQuery选择器字符串以获得最佳性能有任何想法?

kam*_*ens 36

毫无疑问,首先按标签名称过滤要比按类过滤快得多.

在所有浏览器本地实现getElementsByClassName之前都会出现这种情况,就像getElementsByTagName的情况一样.


Mat*_*ley 14

在某些情况下,您可以通过限制其上下文来加速查询.如果您有元素引用,则可以将其作为第二个参数传递以限制查询的范围:

$(".myclass", a_DOM_element);
Run Code Online (Sandbox Code Playgroud)

应该比快

$(".myclass");
Run Code Online (Sandbox Code Playgroud)

如果你已经有一个_DOM_element并且它明显小于整个文档.

  • 我记得`$('.myclass',a_DOM_element)`jQuery转换为/调用`$(a_DOM_element).find('.myclass')`所以它*可能*稍微快一点,只需使用[`find() `](http://api.jquery.com/find/),而不是像第一个例子中那样建立[selector context](http://api.jquery.com/jquery/#selector-context). (2认同)

Dmi*_*kov 5

为了充分理解更快的内容,您必须了解CSS解析器的工作原理.

您传入的选择器使用RegExp拆分为可识别的部分,然后逐个处理.

一些选择器如ID和TagName,使用浏览器的本机实现更快.虽然其他类似的类和属性是分开编程的,因此速度要慢得多,需要循环选择元素并检查每个类名.

所以是的回答你的问题:

$('tag.class')比$('.class')更快.为什么?在第一种情况下,jQuery使用本机浏览器实现将选择过滤到您需要的元素.只有这样它才会启动较慢的.class实现过滤到您要求的内容.

在第二种情况下,jQuery使用它的方法通过抓取类来过滤每个元素.

由于所有javascript库都基于此,因此这比jQuery进一步传播.唯一的另一个选择是使用xPath,但目前在所有浏览器中都没有得到很好的支持.


小智 5

正如Reid所说,jQuery是自下而上的.虽然

这意味着$('#foo bar div')慢很多$('bar div #foo')

这不是重点.如果你有,#foo你不会在选择器中放任何东西,因为ID必须是唯一的.

重点是:

  • 如果你从带有ID的元素中选择任何东西,那么先选择后面的,然后再使用.find,.children等等:$('#foo').find('div')
  • 您最左边(第一)选择的部分可以是效率较低缩放到最右边(最后)的一部分应该是最有效的-这意味着,如果你没有一个ID确保你正在寻找$('div.common[slow*=Search] input.rare'),而不是$('div.rare input.common[name*=slowSearch]')-因为这ISN" t始终适用确保通过相应的分割强制选择器顺序.