【问题标题】:In jQuery, which is faster, a selector, or an equivalent function, or does it depend?在jQuery中,哪个更快,选择器或等效函数,还是依赖?
【发布时间】:2010-01-14 14:12:39
【问题描述】:

我经常想知道 jQuery 中选择器与等效函数的使用。我的意思是包含返回相同结果集但构造不同的相同组件的语句。

举个例子:

alert($("#FundManager1>option").length);
alert($("#FundManager1").find("option").length);

(注意:目的是针对两个等效查询 - 如果它们并不总是相同,请指出这一点,我将不胜感激)

那么,鉴于上面的例子,速度/性能有什么真正的区别吗?显然,前者更短,因此会导致上传/下载的字节数更少,但我目前对此并不感兴趣。

【问题讨论】:

  • 在 CSS 中,> 是一个(直接)子选择器。因此,不能保证您上面的代码产生相同的结果集。
  • 你是对的,但假设#FundManager1<select> 元素,结果将是相同的。
  • @DouweM 前提是您没有使用optgroup s(并且将来不会使用它们),是的:)
  • 你应该比较.children('options')而不是.find('options')

标签: jquery performance selector


【解决方案1】:

我会说第一个更快,因为它只解析一个 CSS 选择器并且只查找子项,而第二个必须解析两个,并且必须查找所有后代。

但我不会为这么小的事情而烦恼。由于 JavaScript 在 WebKit 和 Gecko 中非常快,而在 IE 中仍然相对较快,所以没有人会注意到其中的区别。


从我通过查看 jQuery/Sizzle 源代码可以看出,两段代码在内部执行相同的操作。

首先执行document.getElementById('FundManager1')Sizzle 足够聪明,知道#FundManager1 的含义),然后使用它作为上下文搜索option。两段代码之间的唯一区别是使用了> 选择器,导致Sizzle 只搜索上下文的直接子代,而不是所有后代。我认为这更快,因为只需要探索一层 DOM 层次结构。


另一个编辑:

以上文字仅适用于不支持document.querySelectorAll(css_selector) 方法的浏览器!在浏览器中(WebKit 和 Gecko,也许是 Opera?)使用此方法而不是 Sizzle,因此所有 CSS 选择器解析都由浏览器本身完成,而不是 jQuery 框架,我敢肯定这是很多更快。

【讨论】:

  • 不错的答案。 (此处填写)
  • 深入/分析其他人的代码总是很有趣 ;-) 特别是当它是好的代码时。
猜你喜欢
  • 2011-03-12
  • 2013-09-06
  • 2011-05-14
  • 1970-01-01
  • 1970-01-01
  • 2015-10-18
  • 2020-03-24
  • 1970-01-01
  • 2011-04-23
相关资源
最近更新 更多