javascript - 使用 JavaScript 动态插入 DIV 的成本有多高?

标签 javascript html performance dom

经过与自己多次辩论后,我决定动态创建覆盖 Canvas 的 div。但我有一个问题。动态创建div的成本有多高?如果我有一个完整的 Canvas - 1000x1000 - 充满 16x16 div,会不会很困惑?如果有 1000 个隐藏的 div 会更糟糕吗? (或显示:无)?

或者我应该将鼠标坐标与保存 x,y 位置的容器进行比较,并且必须将图像渲染到 Canvas 上。

我倾向于第一个更有效率,但我不确定。也许有一个中间立场。

对回复很感兴趣!感谢您抽出时间。

(如果这是转发,我很抱歉,我尝试过谷歌)

最佳答案

这完全取决于 DIV 是如何插入到 DOM 中的。理想情况下,您应该在内存中构建 DIV,并通过一个操作将它们注入(inject)到 DOM 中。有多种方法可以做到这一点(请参阅benchmark test cases以获取各种完整示例)。

如果您使用 jQuery,您可以像这样在内存中构建元素:

var i = 1000;
var aHTML = [];
while (i--) {
  aHTML.push("<div>a new div</div>");
}
var sHTML = aHTML.join("");
var domElmt = $(sHTML);

然后将该 DIV 插入到 DOM 中:

$('body').append(domElmt);

如果您不使用 jQuery,则需要使用 createDocumentFragmentcloneNodeappendChild 等。这些是 native 浏览器方法,并且将是最快的(我可以在 Intel Q8200 上使用 Chrome 21 实现大约两倍的速度),但是如果您需要构建复杂的 DOM 结构,那么使用这些 native 方法会比较棘手。 native 方法也可能有 cross-browser support issues

如果您对其工作原理感兴趣,请查看 John Resig 的这篇旧帖子:http://ejohn.org/blog/dom-documentfragments/

现在将其与使用每个 DIV 访问 DOM 的方法进行对比:

var i = 1000;
while (i--) {
    $('body').append("<div>a new div</div>");
}

代码行数较少,但效率很低。

<强> Run the jsPerf DOM Insertion Benchmark

对于我的 Chrome 计算机上的基准测试,在内存中渲染 DIV 并一次性注入(inject)所有 DIV 比将每个单独的 DIV 单独注入(inject) DOM 快 38 倍。

最终,DOM 遍历/操作是您想要避免的。重复的 DOM 遍历/操作是昂贵的操作,并且肯定会在 1000x1000 DIV Canvas 上陷入困境——尤其是在较旧的浏览器上。

编辑:自从我发布这个问题以来,@RobG、@Devu 和我针对各种 DOM 插入方法整理了一堆不同的基准测试。在某些浏览器(Chrome、Safari)上最快的方法是使用 createDocumentFragmentcloneNode 等,但令人惊讶的是在其他浏览器(FireFox 15、Internet Explorer 等)上创建通过 array.join() 插入长 HTML 字符串并通过 innerHTML 插入实际上是最快的方法。

关于javascript - 使用 JavaScript 动态插入 DIV 的成本有多高?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12420038/

相关文章:

javascript - 允许链接在 Bot 的弹出窗口中打开

javascript - 使用 jquery 将变量作为百分比插入到 css 中

html - CSS 仅通过兄弟选择器选择一个元素

ruby-on-rails - 返回 : Higher development speed than others?

ruby-on-rails - rubymine 中的分析器

javascript - 使用 Sweet Alert(又名 Swal)提交表单

javascript - 无效值错误: setCenter : not a LatLng or LatLngLiteral Object

javascript eval 反斜杠在window NT路径问题

html 嵌入式 flash wav 播放器

java - 反序列化 JSON 请求中包含许多对象的列表期间的性能问题