提高jQueryselect器性能的好方法?

我正在寻找任何方式来提高jQuery调用的select器性能。 具体来说就是这样的:

$("div.myclass")$(".myclass")更快

我认为这可能是,但我不知道如果jQuery是足够聪明的限制search标签名称第一等任何人有任何想法如何制定一个jQueryselect器string的最佳性能?

毫无疑问, 首先通过标记名进行过滤要比通过类名进行过滤快得多

直到所有浏览器本地实现getElementsByClassName为止,情况就是如此,getElementsByTagName就是这种情况。

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

 $(".myclass", a_DOM_element); 

应该快于

 $(".myclass"); 

如果你已经有了a_DOM_element,并且它比整个文档要小的多。

正如里德所述,jQuery正在从下往上工作。 虽然

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

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

重点是:

  • 如果你从一个带有ID的元素中select了任何东西,那么先select后面的元素,然后使用.find.find等。 $('#foo').find('div')
  • 你最左边的(第一个)select器的一部分可能效率不高,最右边的(最后一个)部分应该是最有效率的 – 也就是说,如果你没有ID,确保你正在寻找$('div.common[slow*=Search] input.rare')而不是$('div.rare input.common[name*=slowSearch]') – 因为这并不总是适用的确保通过相应的分割强制select器顺序。

为了完全理解什么是更快的,你必须了解CSSparsing器是如何工作的。

您传入的select器使用RegExp分割成可识别的部分,然后逐个处理。

一些select器如ID和TagName,使用浏览器的本地实现更快。 而其他类如类和属性分别编程,因此慢得多,需要遍历选定的元素,并检查每个类的名称。

所以是的回答你的问题:

$('tag.class')比$('。class')快。 为什么? 在第一种情况下,jQuery使用本地浏览器实现将select过滤到您所需的元素。 只有这样,才会启动较慢的.class实现过滤,直到您所要求的为止。

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

这比jQuery更进一步,因为所有的JavaScript库都基于这个。 唯一的其他select是使用xPath,但目前在所有浏览器中都不是很好支持。

这里是如何增加你的jQueryselect器的性能:

  • 尽可能用#idselect( 性能testing结果 〜250更快)
  • 指定select范围( $('.select', this)

我会添加一个注意事项,在99%的Web应用程序中,即使是Ajax重度应用程序,Web服务器的连接速度和响应也会驱动应用程序的性能,而不是JavaScript。 我并不是说你应该写有意识的慢代码,或者一般意识到哪些事情可能比其他事情更快。

但是我想知道如果你试图解决一个还没有真正存在的问题,或者即使你正在优化一些可能在不久的将来会改变的东西(比如说,如果有更多的人开始使用支持getElementsByClassName()的浏览器getElementsByClassName()函数),使你优化的代码实际上运行得更慢。

另一个查找performance信息的地方是Hugo Vidal Teixeira对select器页面的性能分析。

http://www.componenthouse.com/article-19

这给了select器的id,select器类和select器前缀标签名称的速度很好。

id最快的select器是:$(“#id”)

按类最快的select器是:$('tag.class')

所以按标签前缀只有在按类select时才有帮助!

我已经在一些jQuery邮件列表中,从我读到的那里,他们很可能通过标签名称然后类名称(如果更快,反之亦然)过滤。 他们对速度十分迷恋,并会用任何方式来获得表演的乐趣。

无论如何,我真的不会太担心,除非你运行这个select器数千次/秒。

如果你真的担心,试着做一些基准testing,看看哪个更快。

考虑使用Oliver Steele的顺序库来随时调用方法,而不是一次调用方法。

http://osteele.com/sources/javascript/sequentially/

“最终”方法可以帮助您在最初调用一定时间后调用方法。 “顺序”方法允许您在一段时间内排列几个任务。

很有帮助!

从我问的一个问题的一个伟大的提示 :尽可能使用标准的CSSselect器 。 这允许jQuery使用select器API 。 根据John Resig所做的testing ,这会导致select器的性能接近本机。 函数如:has():contains()应该被避免。

从我的研究支持的select器API引入了jQuery 1.2.7,Firefox 3.1,IE 8,Opera 10,Safari 3.1。

如果我没有弄错,jQuery也是一个自下而上的引擎。 这意味着$('#foo bar div')$('bar div #foo')慢很多。 例如, $('#foo a')将遍历页面上的所有元素,看看它们是否具有#foo的祖先,这使得这个select器非常低效。

Resig可能已经针对这种情况进行了优化(如果他这么做,我不会感到惊讶 – 我相信他是在他的Sizzle引擎中做的,但是我不是100%肯定的)。

我相信,通过IDselect第一个总是更快:

 $("#myform th").css("color","red"); 

应该快于

 $("th").css("color","red"); 

但是,我不知道有多less链接帮助开始使用ID? 这是

 $("#myform").find("th").css("color","red") .end().find("td").css("color","blue"); 

比这更快吗?

 $("#myform th").css("color","red"); $("#myform td").css("color","blue");