从性能的角度来看:这取决于具体情况。
在你提供的简短示例中,追加文本会更快,因为直到最后你实际上并没有创建任何DOM元素。然而,如果你需要大量这样的操作,那么字符串拼接所耗费的时间就会逐渐增加,而缓存文档片段的性能优势也就凸显出来了。
当你执行$(html)
时,jQuery会将其作为文档片段进行缓存(前提是字符串大小小于512字节),但是如果你只是缓存$("<div />")
,则性能提升并不明显。然而,如果你需要执行这种操作数千次,那么字符串拼接的代价随着字符串长度的增加而变得越来越昂贵,而缓存文档片段的成本则相对稳定。
更新:下面是一些示例,你可以使用Firebug来查看控制台时间:
你可以在这里运行代码:http://jsfiddle.net/Ps5ja/
console.time('concat');
var html = "";
for(var i = 0; i < 500; i++) {
html += '<div><span>Some More Stuff</span></div>';
html += '<div>Some Conditional Content</div>';
}
var elem = $(html);
console.timeEnd('concat');
console.time('DOM');
var parent = $("<div />")
for(var j = 0; j < 500; j++) {
parent.append($('<div/>').append($('<span/>', {text :'Some More Stuff'})));
parent.append($('<div/>',{ text: 'Some conditionalContent' }));
}
console.timeEnd('DOM');
console.time('concat caching');
var html = "";
for(var i = 0; i < 5000; i++)
html += '<div><span>Some More Stuff</span></div><div>Some Conditional Content</div>';
var elem = $(html);
console.timeEnd('concat caching');
console.time('DOM caching');
var parent = $("<div />")
for(var j = 0; j < 5000; j++)
parent.append('<div><span>Some More Stuff</span></div><div>Some Conditional Content</div>');
console.timeEnd('DOM caching');
注意:字符串测试中的var elem = $(html);
是为了确保我们创建相同的DOM元素,否则您将比较字符串连接和实际的DOM创建,这几乎不公平,并且也没有什么用 :)从上面可以看出,当缓存的片段更复杂时,缓存的影响越大。在第一个测试中,也就是您的示例未经过清理的情况下,由于有许多小操作进行,所以DOM会输掉,在此测试中(在我的机器上,但您的比率应该大致相同):HTML Contact: 25ms,DOM Manipulation: 149ms。
然而,如果您可以缓存复杂的片段,则可获得不重复创建这些DOM元素的好处,只需克隆它们。在第二个测试中,由于HTML方法创建了那个DOM元素集合5000次,因此第二个缓存方法仅创建了一次,并将其克隆5000次。在此测试中:HTML Concat: 282ms,DOM Manipulation: 157ms。
我意识到这并不是针对您的问题直接的回答,但基于评论似乎对性能有一些好奇,因此提供一些您可以看到/测试/玩耍的内容。