【问题标题】:serious performance problem with jquery find in firefoxFirefox 中 jquery 的严重性能问题
【发布时间】:2011-02-25 08:59:45
【问题描述】:

这是一段简单的 jQuery 代码:

alert($(document).find("*").length);
alert($(document).find("v\\:group").length);
alert($(document).find("v\\:group").find("*").length);

在非 Firefox 浏览器中,所有 3 个步骤都会立即返回;在 firefox 3.6 中,第三步似乎需要很长时间(我让它以 100% CPU 运行超过一分钟,但没有完成)。我使用的是最新的 jQuery (1.5.1),但在 1.4.2 中得到了相同的结果。

返回的计数是 10000、50 和 2000,因此您可以看到,虽然文档的大小不是微不足道的,但它不应该大到出现这样的严重性能问题。

作为对之前帖子的回应,我想进一步澄清一下:该文档是包含一些嵌入式 VML(特定于 IE)的 HTML。我知道 jquery 不能正确支持命名空间,但我认为这是在 jQuery 中搜索 HTML 命名空间之外的节点的最佳方式。

让我感到困惑的是,即使我了解 find("") 的性能不是很好,但我不明白为什么要花费如此大量的时间来查找 2000 个节点.find() 瞬间找到10000个节点

【问题讨论】:

  • 你能告诉我 "v\\:group" 究竟选择了什么吗?
  • 在任何情况下我都会避免使用find("*")。如果您确实需要到达所有后代节点,那么“手动”遍历树会更明智。
  • v:\\group 不是和 VML 有关系吗?
  • @meo:它将选择名称为 v:group 的所有笔记 - 这不是有效的 HTML,但它是一个完全有效的 XML 标记名称。
  • @RoToRa:由于操作从 document 查找后代,因此它是 HTML,因此无论如何都是无效的。

标签: jquery performance firefox


【解决方案1】:

看起来 Firefox 例程遍历 dom 并返回节点的性能不是很好。看来这不可能是 jQueries 错误,因为其他浏览器似乎处理得更好。

【讨论】:

  • 向 jQuery 推荐它可能是一个想法,但遗憾的是,它可能只是一个 firefox 的东西。
【解决方案2】:

好的,我明白了。原来 jQuery 是无辜的;这是因为 Firefox 以不同的方式解析 HTML。似乎如果你有一些像这样的“HTML”源:

<v:group />
<v:group />
<v:group />

Firefox 像这样构建 DOM:

<v:group>
    <v:group>
        <v:group />
    </v:group>
</v:group>

所以$(document).find("v\\:group").find("*") 从 O(n) 变为 O(n^2),因此在我的文档中有数千个 &lt;v:group&gt;s 的性能差异很大。

我希望 firefox 能像其他浏览器一样解析它,但我不会称它为错误,因为我认为这不是有效的 HTML。

【讨论】:

  • 您使用的是什么 MIME 类型?除非您使用 application/xhtml+xml,否则 Firefox 不会知道它是 X(HT)ML,并且会使用它的 HTML 解析器而不是 XML 解析器。
  • 而 HTML 解析器会忽略 /s,因此关闭未知标签的唯一方法是使用完整的关闭标签 &lt;/v:group&gt;
猜你喜欢
  • 2015-05-01
  • 2018-02-28
  • 1970-01-01
  • 2018-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多