从性能的角度来看:这取决于。
在您的简短示例中,附加文本更快,因为您实际上直到最后才创建任何 DOM 元素。但是,如果您这样做很多,则字符串连接所增加的时间与缓存文档片段的性能相加。
当您执行 $(html) 时,jQuery 会将其缓存为 document fragment(前提是该字符串为 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'); //25ms
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'); //149ms
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'); //282ms
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'); //157ms
注意:字符串测试中的 var elem = $(html); 是为了让我们最终创建相同的 DOM 元素,否则您会将字符串连接与实际 DOM 创建进行比较,这几乎不是公平的比较,也不是真正有用的: )
从上面可以看出,缓存的fragment越复杂,缓存的影响越大。在第一个测试中,这是你的例子,没有清理一下条件,DOM 丢失,因为有很多小操作正在进行,在这个测试中(在我的机器上,但你的比率应该大致相同): HTML 联系人:25 毫秒,DOM 操作:149 毫秒。
但是,如果您可以缓存复杂的片段,您就不必重复创建这些 DOM 元素,只需克隆它们即可。在第二个测试中,DOM 胜出,因为虽然 HTML 方法创建了 DOM 元素集合 5000 次,但第二个缓存方法只创建了 一次,并克隆了 5000 次。在这个测试中:HTML Concat:282ms,DOM Manipulation:157ms。
我意识到这不是直接回答您的问题,但基于 cmets 似乎对性能有些好奇,所以只是提供一些您可以看到/测试/玩的东西。 p>