javascript对Dom操作中table添加行性能问题
在做一个js控件的时候,需要从后台取的数据后将内容添加到一个表格中,当数据量在1000行以上的时候,数据加载在IE下面会很慢,代码如下:
页面代码:
<table class="bb"></table>
js代码
$("#Button1").click(function () { $.post("http://localhost:49017/table/a.ashx", {}, function (data) { var a = new Array(); var k = 0; var t1 = new Date().getTime(); for (var d in data) { a.push("<tr>"); a.push("<td>" + data[d]["id"] + "</td>"); a.push("<td>" + data[d]["sn"] + "</td>"); a.push("<td>" + data[d]["title"] + "</td>"); a.push("<td>" + data[d]["size"] + "</td>"); a.push("<td>" + data[d]["os"] + "</td>"); a.push("<td>" + data[d]["charge"] + "</td>"); a.push("<td>" + data[d]["price"] + "</td>"); a.push("</tr>"); } var t2 = new Date().getTime(); var sss = a.join(''); var t3 = new Date().getTime(); $(".bb").html(sss); var t4 = new Date().getTime(); alert("拼接数据时间为:" + (t2 - t1) + "毫秒,转换数据时间为:" + (t3 - t2) + "毫秒,加载" + (t4 - t3)); }, "json"); });
在IE8下返回的测试数据如下:
在chrome下面返回的测试数据如下 :
当数据越来越多的时候 $(".bb").html(sss);ie下面这段代码执行的时间越来越长 ,而其他的时间都是在可以接受的范围。当中间的数据太多的时候,执行效率完全无法接受 。
对操作只做一个小小的调整,把table拼出来后加载到div中。代码如下 :
<div class="aa"> </div>
js代码如下
$("#Button2").click(function () { $.post("http://localhost:49017/table/a.ashx", {}, function (data) { var a = new Array(); var k = 0; var t1 = new Date().getTime(); a.push("<table>"); for (var d in data) { a.push("<tr>"); a.push("<td>" + data[d]["id"] + "</td>"); a.push("<td>" + data[d]["sn"] + "</td>"); a.push("<td>" + data[d]["title"] + "</td>"); a.push("<td>" + data[d]["size"] + "</td>"); a.push("<td>" + data[d]["os"] + "</td>"); a.push("<td>" + data[d]["charge"] + "</td>"); a.push("<td>" + data[d]["price"] + "</td>"); a.push("</tr>"); } a.push("</table>"); var t2 = new Date().getTime(); var sss = a.join(''); var t3 = new Date().getTime(); $(".aa").html(sss); var t4 = new Date().getTime(); alert("拼接数据时间为:" + (t2 - t1) + "毫秒,转换数据时间为:" + (t3 - t2) + "毫秒,加载" + (t4 - t3)); }, "json"); });
在IE8下返回的测试数据如下:
在chrome下面返回的测试数据如下 :
对比上面的测试数据 chrome变化不大,方法一的执行效率还要高一点 ,在ie下面就是大幅度的提升效率了。将加载时间降低了10倍以上。
总结:
在ie下面对table加载tr td对象应该是引起了某种操作,导致效率低。而将table加到div上就不会引起这种操作 。在js操作dom对象的时候,需要尽量减少对dom的操作 。
推荐一篇关于dom操作的文章: 提升JavaScript运行速度之DOM篇