从JavaScript创建HTML元素时有哪些性能考虑因素?

时间:2013-09-08 06:25:04

标签: javascript jquery html performance dom

我想使用JavaScript创建一个HTML部分,所以我有两个选择:

  1. 我可以使用createElement()函数创建HTML元素:

    document.createElement('div');
    
  2. 我可以直接创建"<div>Test</div>"之类的元素作为字符串。

  3. 哪一个性能更好?

4 个答案:

答案 0 :(得分:4)

直接使用DOM API要快得多,因为它不必调用HTML解析器。

 var div = document.createElement("div");
 container.appendChild(div);

快得多
 container.innerHTML += "<div></div>";

但是,在大多数情况下,除非您正在执行对性能敏感的事情,否则请使用创建更易读代码的代码。

答案 1 :(得分:2)

有点偏离主题,但如果有人打算使用innerHTML

,我认为这是一个重点

这是非常错误的:

container.innerHTML = "<div>";
container.innerHTML += "Hello ";
container.innerHTML += "World";
container.innerHTML += "</div>";

如果你真的需要编写字符串,只在html完成时附加它,你不想用不完整的html多次调用解析器。

var html;
html = "<div>";
html += "Hello ";
html += "World";
html += "</div>";

container.innerHTML = html;

另一点是innerHTML将再次解析所有内容,并将删除附加到容器内元素的任何事件处理程序。

container.innerHTML += moreContent; //previous content lost their event handlers

使用DOM,您无需担心,只会解析新内容。

container.appendChild(moreContent);

答案 2 :(得分:2)

每次调用DOM操作方法时,浏览器都必须计算页面上所有元素的相对位置和大小。并再次渲染它。此过程称为回流。关于回流的一篇陈旧但仍然很好的文章可以在http://ajaxian.com/archives/browser-reflows-how-do-they-affect-performance找到。

现在可以说,更新DOM是一件昂贵的事情。它应该被最佳使用。本杰明提到的是正确的。但是如果你继续直接更新DOM,它会反复触发重排,这可能会降低性能。

更好的方法是使用DocumentFragmentDavid Walsh也可以找到一个非常快速的解释。

答案 3 :(得分:-1)

从下面的基准测试来看,似乎innerHtml比使用DOM方法要快得多(我尝试使用Chrome和IE):

http://www.quirksmode.org/dom/innerhtml.html#t10

http://jsperf.com/realistic-innerhtml-vs-appendchild/15