【问题标题】:JAVASCRIPT DOM searching or DOM relation, which is the faster way?JAVASCRIPT DOM 搜索或 DOM 关系,哪种方式更快?
【发布时间】:2014-10-27 09:11:58
【问题描述】:

假设我有以下 HTML 结构

<div>
    <div id="foo"></div>
</div>
<div>
    <div id="bar"></div>
</div>

现在我需要当我点击“foo”时,“bar”的innerHTML变成“hello”。我基本上有两种方法可以到达“bar”元素:

document.getElementById("foo").onclick=function(){
    document.getElementById("bar").innerHTML="hello";
}

document.getElementById("foo").onclick=function(){
    this.parentNode.nextElementSibling.firstElementChild.innerHTML="hello";
}

这两种方法/属性都是本机 DOM 的一部分,但我想知道后者是否比前者稍快,因为 getElementById 应该遍历文档的所有 ID,直到达到第一个匹配项?

【问题讨论】:

  • @Frank Dai,请考虑不仅要更快,还要考虑该代码的维护。假设将来,您想在两者之间放置一个简单的图像。然后,诸如“this.parentNode.nextElementSibling.firstElementChild.innerHTML”之类的东西将停止工作。
  • 是的。我知道缓存,这种基于关系的代码很容易受到未来修改的影响。我的观点是哪种方式更快,即使差异可能小于 2-3 毫秒。
  • 哪种方式“更快”无关紧要。代码没有性能问题;请参阅我对乔的回答的评论。只是不要担心它;去寻找真正受益于优化的 3% 的代码..

标签: javascript html dom browser


【解决方案1】:

更快的是,在页面加载时缓存元素,以供将来查找:

var fooEl = document.getElementById("foo");
var barEl = document.getElementById("bar");

fooEl.onclick=function(){
    barEl.innerHTML="hello";
}

您应该缓存任何 1) 昂贵且 2) 永远不会改变的查找或计算。并且您应该在页面加载时进行查找,以便在用户执行某些操作之后不会发生查找,而是在用户什么都不做时进行查找(在此期间,用户什么都不做,你可以免费进行预加载和预缓存)。

【讨论】:

  • 在点击处理程序中执行查找无论如何都不会成为瓶颈。 (当像 cola'd 编码器一样单击时,我的最大点击次数约为 8 次/秒。)考虑到,通过 ID 获取元素也是一个非常快速的操作(并且两眼线性跟随也几乎不是一项昂贵的操作)。由于如果稍后修改 DOM,“缓存”元素可能会出现问题(尽管特定的单击绑定使得这不太可能),除非绑定闭包(变量)增加了好处,否则我不会这样做。代码没有性能问题,因此唯一关心的是清晰度/可维护性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 2011-03-27
  • 1970-01-01
  • 1970-01-01
  • 2014-02-25
  • 1970-01-01
  • 2021-03-06
相关资源
最近更新 更多