您现在的位置: 365建站网 > 365文章 > Javascript之createElement和innerHTML增加页面元素的性能对比

Javascript之createElement和innerHTML增加页面元素的性能对比

文章来源:365jz.com     点击数:365    更新时间:2009-09-18 10:22   参与评论

最近遇到js的效率问题,是关于在页面中新增元素的问题。

假设我们有页面如下:

<HTML>
<HEAD>
</HEAD>
<BODY>
<div id="div1"></div>
</BODY>
<script>
   
// 脚本位置
</script>
</HTML>

现在,我们要往div1中添加对象,大家都知道在为web页面增加一个元素时可以使用如下代码:

//方法1
div1.innerHTML  = '<a href="">测试</a>';

或者:

//方法2
var a = document.createElement('a');

a.innertText = '测试';
div1.appendChild(a);

在网上搜索到一个探讨js效率问题的文章,其大概意思是说方法2的效率高,其对比代码如下:

// 方法1
function init(){
var staDate = new Date();
var doc = window.document;
for(var i=0;i<100;i++){
var str="<div id='div_'"+i+"' style='width:100px; height:20px;background-color:#eee'>test</div>";
container.innerHTML 
+= str;
}
alert(
new Date - staDate);
}
//方法2
function init(){
var staDate = new Date();
var doc = window.document;
for(var i=0;i<100;i++){
var oDiv = doc.createElement("div");
var oText = doc.createTextNode("text");
oDiv.appendChild(oText);
container.appendChild(oDiv);
oDiv.style.id 
= "div_"+i;
oDiv.style.width 
= "100px";
oDiv.style.height 
= "20px";
oDiv.style.backgroundColor 
= "#eee";
}
alert(
new Date - staDate);
}

其页面中有:

<div id="container"></div>
<input type="button" value="start" onclick="init();" />

从执行效果来看方案2要比方案1快10倍左右,到底这是不是真的呢?其实上面的测试代码是有待商榷的,且看其方法1中的循环代码:

for(var i=0;i<100;i++){
var str
="<div id='div_'"+i+"' style='width:100px; height:20px;background-color:#eee'>test</div>";
container.innerHTML += str;
}

其中有很多字符串操作,而且除了使用+号来连接字符串外,还使用了+=操作符,这就是问题的所在了,在javascript中这种操作字符串的做法是严重影响效率的,所以使用上面的方法来测试createEmenent和innerHTML的效率对innerHTML是不公平的, 据此看来很可能是字符串操作吃掉了innerHTML的性能,于是写了下面的测试代码:

<HTML>
<HEAD>
</HEAD>
<BODY>
<input type="button" value="测试1" onclick="test1()" /><input type=text readonly id=t1>
<input type="button" value="测试2" onclick="test2()" /><input type=text readonly id=t2>
<input type="button" value="清空" onclick="div1.innerHTML = ''; div2.innerHTML = ''; t1.value=''; t2.value = '';" />
<div id="div1"></div>
<div id="div2"></div>
</BODY>
<script>
function test1()
{
    
var d = new Date();
    
var buf = new Array();
    
for (var n = 0; n < 1000; n ++)
    {
        buf.push(
'<a href="">测试');
        buf.push(n);
        buf.push(
'</a>');
    }
    
    div1.innerHTML 
= buf.join('');

    t1.value 
= '耗时:' +  (new Date() - d);
}

function test2()
{
    
var d = new Date();
    
for (var n = 0; n < 1000; n ++)
    {
        
var e = document.createElement('a');
        e.href 
= '';
        e.innerText 
= '测试' + n;
        div2.appendChild(e);
    }
    
    t2.value 
= '耗时:' +  (new Date() - d);
}
</script>
</HTML>

经测试发现:

1、在创建的对象较少(0-大约10左右)时,innerHTML和createElement效率差不多,测试值悠忽不定;

2、在创建对象多于20时,innerHTML要比createElement效率高很多,平均测试差不多createElement耗时是innerHTML的两倍。

总结:其实效率也在于编写的代码,在知道可用的API的效率后,怎么编写代码也是非常重要的,否则应由的执行效率不能体现出来,就如上面从网上搜到的那些代码,得出一个与事实相悖的结论。

如对本文有疑问,请提交到交流论坛,广大热心网友会为你解答!! 点击进入论坛

发表评论 (365人查看0条评论)
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
昵称:
最新评论
------分隔线----------------------------

快速入口

· 365软件
· 杰创官网
· 建站工具
· 网站大全

其它栏目

· 建站教程
· 365学习

业务咨询

· 技术支持
· 服务时间:9:00-18:00
365建站网二维码

Powered by 365建站网 RSS地图 HTML地图

copyright © 2013-2024 版权所有 鄂ICP备17013400号