如果我现在想往页面里加入一个表格我可能会这样写.
//创建 table
var table = document.createElement("table"); table.border = 1;
table.width = "100%";
//创建 tbody
var tbody = document.createElement("tbody");
table.appendChild(tbody);
//创建第一行
var row1 = document.createElement("tr");
tbody.appendChild(row1);
var cell1_1 = document.createElement("td"); cell1_1.appendChild(document.createTextNode("Cell 1,1")); row1.appendChild(cell1_1);
var cell2_1 = document.createElement("td"); cell2_1.appendChild(document.createTextNode("Cell 2,1"));
row1.appendChild(cell2_1);
//创建第二行
var row2 = document.createElement("tr"); tbody.appendChild(row2);
var cell1_2 = document.createElement("td");
cell1_2.appendChild(document.createTextNode("Cell 1,2"));
row2.appendChild(cell1_2);
var cell2_2= document.createElement("td");
cell2_2.appendChild(document.createTextNode("Cell 2,2"));
row2.appendChild(cell2_2);
//将表格添加到文档主体中
document.body.appendChild(table);
但如果我用innerHTML仅仅只需要拼接字符串即可?到底用哪种方式好?
请从多角度说明,比如说从性能角度去考虑。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
非常不喜欢使用innerHTML,因为使用javascript拼接html和使用java拼接javascript一样丑陋。
当只插入一次时,createElement能够产生半成品(能添加事件等其他的操作),给浏览器时浏览器需要做的额外的事情比解html析字符串少。
如果需要大量的插入时,用
createElement再appendChild肯定比innerHTML差,但是createDocumentFragment再appendChild会更好。另外,这里的文章
还有测试结果
都表明了最好不要用innerHTML。
我自己查到了合适的答案。
简单的说就是以前确实是用appendChild这么慢的方式一步步插入;
HTML出来的新的标准,提供了插入标记的方法innerHTML。
以上引自《Javascript高级程序设计》——11.3.6 插入标记
appendChild是每次插入的内容都成为该元素的最后一个子元素。(插入)
innerHTML是整个重写该元素内的所有HTML代码,也就是说之前写的那些都会被覆盖。(覆盖)
从性能上说,innerHTML效率要高一些,因为直接解析字符串比创建html节点对象再生成html节点要快。
但是innerHTML还有两个缺点:
如果你在原来的子元素上绑定了事件的话,重写后事件绑定仍然还在
js代码和html代码耦合程度高,不利于维护
不过如果仅仅要实现一个简单的需求的话,用innerHTML性能还是好些。如果需要大规模重写html的话,可以使用模板引擎来完成。
推荐比较科学的一次性插入较多Dom的方法,使用document fragment。
http://www.w3schools.com/jsref/met_document_createdocumentfragment.asp
首先创建一个document fragment(文档碎片),在里面动态插入Dom元素,最后一次性把这个document fragment插入到Dom树里面。
element.innerHTML和appendChild在每个浏览器表现不一样额,动态创建table,只能用appendChild,在ie有些浏览器不兼容,谷歌表现element.innerHTML更快,火狐appendChild更快