【发布时间】:2011-12-02 23:02:15
【问题描述】:
我在这个主题上发现了一些不同且相互矛盾的答案。
我正在构建一个应用程序,该应用程序主要使用由 jQuery 动态生成的 html,基于从底层 API 以 JSON 数据形式获取的结果。
我的一些同事(个人)告诉我,最好的方法是这样做:
var ul = $("<ul>").addClass("some-ul");
$.each(results, function(index) {
ul.append($("<li>").html(this).attr("id", index));
});
$("body").append($("<div>").attr("id", "div-id").addClass("some-div").append(ul));
等等。 我被告知它的原因是“直接更新 DOM 而不是解析 html 来实现它”。
但是,我看到很多这样的代码(同一个例子):
var toAppend = '<div class="some-div" id="div-id"><ul>';
$.each(results, function(index) {
toAppend += '<li id="' + index + '">' + this + '</li>';
});
toAppend += '</ul></div>'
我个人认为它不那么优雅 - 但它更好吗?我用谷歌搜索了几分钟,找到了this article。基本上,它是关于通过使用字符串连接来大幅提高性能——我的“第二种方式”。
这篇文章的主要问题是它已经在2009年发布并且讨论的jQuery版本是1.3。今天,当前版本是 1.6.4 版本,其行为可能完全不同。这是我已经找到的关于该主题的大多数文章的问题,我也对它们的可信度感到怀疑。
这就是为什么我决定在这里发布问题并询问 - 根据性能,哪种生成 DOM 的方法实际上是正确的?
重要编辑:
我已经编写了一个小基准来测试哪种方法在性能方面更好。
jsFiddle - 串联版本
jsFiddle - 数组加入版本
代码:
var text = "lorem ipsum";
var strings = $("#strings");
var objects = $("#objects");
var results = $("#results");
// string concatenation
var start = new Date().getTime();
var toAppend = ['<div class="div-class" id="div-id1"><ul class="ul-class" id="ul-id1">'];
for (var i = 1; i <= 20000; i++) {
toAppend[i] = '<li class="li-class" id="li-id1-' + i + '">' + text + '</li>';
}
toAppend[i++] = '</ul></div>';
results.append(toAppend.join(""));
strings.html(new Date().getTime() - start);
// jquery objects
var start = new Date().getTime();
var ul = $("<ul>").attr("id", "ul-id2").addClass("ul-class");
for (var i = 0; i < 20000; i++) {
ul.append($("<li>").attr("id", "li-id2-" + i).addClass("li-class"));
}
results.append($("<div>").attr("id", "div-id2").addClass("div-class").append(ul));
objects.html(new Date().getTime() - start);
似乎对字符串进行操作比使用 jQuery 对象和方法更快(在 Firefox 7 中大约是 7 倍)。但我可能是错的,特别是如果这个“基准”代码中有任何错误或降低性能的错误。随意进行任何更改。
注意:我使用数组join是因为前面提到的文章而不是实际的串联。
编辑:根据@hradac 的建议,我在基准测试中使用了实际的字符串连接,它确实改善了时间。
【问题讨论】:
-
如果你做了很多这样的事情,你可能要考虑使用 jquery 模板。它是专门为解决这个问题而构建的。 api.jquery.com/category/plugins/templates
-
@NimChimpsky 我知道这篇文章,它是我每天开发 jQuery 的指导方针之一。它涵盖了我的部分问题,但没有说明哪种约定更好。
-
我建议实际使用字符串连接而不是数组连接。过去数组连接速度更快,但情况发生了变化,现在情况并非如此。 jsperf.com/array-join-vs-string-connect
-
您忘记在 jQuery 示例中设置文本。添加
.text(text)会明显变慢,但确实展示了 jQuery 可以关闭 XSS 向量的优势。
标签: jquery html performance dom