在性能下降之前,浏览器可以安全地处理多少个元素 ID?

Posted

技术标签:

【中文标题】在性能下降之前,浏览器可以安全地处理多少个元素 ID?【英文标题】:How many element id's can browsers safely handle before performance degredation? 【发布时间】:2011-08-05 03:17:57 【问题描述】:

使用元素 ID 是 javascript 获取元素的最快方式。是否有经验法则或最佳实践指南来说明应该使用多少个这些 id 才能预期浏览器性能开始下降?

【问题讨论】:

你的意思是你可以调用多少次document.getElementById 才能开始减速? 相关:how many div's can you have before the dom slows and becomes unstable? 我会选择无限。试着证明我错了:) 我不担心电话的数量,我不明白为什么会有所作为。我担心每个单独调用的运行时间。假设您有 1000 多个带有 ID 的 DOM 元素,这会导致 getElementById 调用性能下降吗? 【参考方案1】:

ID 本身只是一个属性值。唯一的“性能”问题是浏览器必须下载的额外位和字节。从 JavaScript POV 来看,DOM 中的元素越多,遍历它所需的时间就越长,但这与您可能使用的 ID 数量没有直接关系。

编辑:

澄清一下你的JS是不是这样的:

document.getElementById("myID")

您的 html 是否如下所示并不重要:

<div id="div1">
  <div id="div2">
    ...
      <div id="div999">
        <div id="myDiv">

或者这个:

<div>
  <div>
    ...
      <div>
        <div id="myDiv">

对于这两个示例,JS 应该运行相同。

【讨论】:

因此 JavaScript 调用的性能仅受 DOM 数量的影响,而不是具有 ID 的 DOM 数量。浏览器不会创建哈希或其他东西来通过 ID 查找 DOM 元素吗?性能会随着“哈希”大小的增加而降低吗? 只有一个 DOM。 DOM 有节点,每个节点都是一个 HTML 元素。节点越多,javascript 爬过它所需的时间就越长。 ID 只是一个属性,所以使用的数字与 JS 性能没有直接关系。【参考方案2】:

我们有一个包含 1,000 多个字段的表单(不要问),使用 jQuery Validate 进行客户端验证。这包括验证需要哪些字段、检查每个字段的数据类型、根据特定条件显示/隐藏字段组以及在输入数据时跨多个字段运行计算。

只有 MSIE 在这种规模下会放慢速度。 Firefox 和 Chrome “立即”运行验证。 MSIE 最终显示“长时间运行的脚本”对话框。昨晚我收到通知,现在需要额外的字段。

【讨论】:

这些字段的引用是缓存的(在变量/数组/对象中)还是在验证过程中使用$('#id') 来查找每个字段? @Šime Vidas - 表单的元素集合已经拥有其控件的实时集合。特定元素所需的验证类型通常由类值指示,例如 @RobG 啊哈,那么 IE 的慢可以归因于它的 JavaScript 引擎慢。改善 IE 情况的唯一解决方案是优化/重构代码。【参考方案3】:

复杂的页面意味着要下载更多字节,这也意味着 JavaScript 中的 DOM 访问速度较慢。例如,当您想要添加事件处理程序时,如果您在页面上循环遍历 500 或 5000 个 DOM 元素,则会有所不同。

大量的 DOM 元素可能是一种症状,即应该通过页面标记来改进某些内容,而不必删除内容。您是否出于布局目的使用嵌套表?您是否只是为了解决布局问题而投入更多 s?也许有更好、语义更正确的方式来做你的标记。

YUI CSS 实用程序对布局有很大帮助:grids.css 可以帮助您进行整体布局,fonts.css 和 reset.css 可以帮助您去除浏览器的默认格式。这是一个重新开始思考标记的机会,例如,仅在语义上有意义时才使用 s,而不是因为它呈现新行。

DOM 元素的数量很容易测试,只需在 Firebug 的控制台中输入: document.getElementsByTagName('*').length

【讨论】:

就 DOM 元素而言,您希望保持在上限是否有任何公认的最佳实践?我在一台非常快的机器上,所以虽然我的机器上的一切都运行得非常顺利,但我担心用户在较弱设备上的体验,包括 iPad 等移动设备。对于这些移动浏览器可以处理的负载是否有任何共识? iPad 绝不是一个“弱”设备。唯一常用的经验法则是“将您的页面 + 资产保持在 100k 以下”,但这只是经验法则,更多地与传统带宽问题有关。如今,许多 Web 应用程序在 DOM 结构方面都非常复杂。除了构建、测试和重新测试之外,没有一成不变的规则。重复。

以上是关于在性能下降之前,浏览器可以安全地处理多少个元素 ID?的主要内容,如果未能解决你的问题,请参考以下文章

在数组中的每个项目之前有多少个连续元素较小

“现代”浏览器一次可以“处理”多少个 HTML 元素?

Firebase 性能:每个节点有多少个子节点?

在遇到性能问题之前,iOS 上可以同时显示多少个 UIView?

Java 安全管理器会降低性能吗?

网页上可以有多少元素/多少数据?