Javascript createElement和innerHTML增加頁(yè)面元素的性能對(duì)比
更新時(shí)間:2009年09月17日 20:59:05 作者:
Javascript之createElement和innerHTML增加頁(yè)面元素的性能對(duì)比
最近遇到j(luò)s的效率問(wèn)題,是關(guān)于在頁(yè)面中新增元素的問(wèn)題。
假設(shè)我們有頁(yè)面如下:
<HTML>
<HEAD>
</HEAD>
<BODY>
<div id="div1"></div>
</BODY>
<script>
// 腳本位置
</script>
</HTML>
現(xiàn)在,我們要往div1中添加對(duì)象,大家都知道在為web頁(yè)面增加一個(gè)元素時(shí)可以使用如下代碼:
//方法1
div1.innerHTML = '<a href="">測(cè)試</a>';
或者:
//方法2
var a = document.createElement('a');
a.innertText = '測(cè)試';
div1.appendChild(a);
在網(wǎng)上搜索到一個(gè)探討js效率問(wèn)題的文章,其大概意思是說(shuō)方法2的效率高,其對(duì)比代碼如下:
// 方法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);
}
其頁(yè)面中有:
<div id="container"></div>
<input type="button" value="start" onclick="init();" />
從執(zhí)行效果來(lái)看方案2要比方案1快10倍左右,到底這是不是真的呢?其實(shí)上面的測(cè)試代碼是有待商榷的,且看其方法1中的循環(huán)代碼:
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;
}
其中有很多字符串操作,而且除了使用+號(hào)來(lái)連接字符串外,還使用了+=操作符,這就是問(wèn)題的所在了,在javascript中這種操作字符串的做法是嚴(yán)重影響效率的,所以使用上面的方法來(lái)測(cè)試createEmenent和innerHTML的效率對(duì)innerHTML是不公平的, 據(jù)此看來(lái)很可能是字符串操作吃掉了innerHTML的性能,于是寫(xiě)了下面的測(cè)試代碼:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
經(jīng)測(cè)試發(fā)現(xiàn):
1、在創(chuàng)建的對(duì)象較少(0-大約10左右)時(shí),innerHTML和createElement效率差不多,測(cè)試值悠忽不定;
2、在創(chuàng)建對(duì)象多于20時(shí),innerHTML要比createElement效率高很多,平均測(cè)試差不多createElement耗時(shí)是innerHTML的兩倍。
總結(jié):其實(shí)效率也在于編寫(xiě)的代碼,在知道可用的API的效率后,怎么編寫(xiě)代碼也是非常重要的,否則應(yīng)由的執(zhí)行效率不能體現(xiàn)出來(lái),就如上面從網(wǎng)上搜到的那些代碼,得出一個(gè)與事實(shí)相悖的結(jié)論。
假設(shè)我們有頁(yè)面如下:
復(fù)制代碼 代碼如下:
<HTML>
<HEAD>
</HEAD>
<BODY>
<div id="div1"></div>
</BODY>
<script>
// 腳本位置
</script>
</HTML>
現(xiàn)在,我們要往div1中添加對(duì)象,大家都知道在為web頁(yè)面增加一個(gè)元素時(shí)可以使用如下代碼:
//方法1
div1.innerHTML = '<a href="">測(cè)試</a>';
或者:
//方法2
var a = document.createElement('a');
a.innertText = '測(cè)試';
div1.appendChild(a);
在網(wǎng)上搜索到一個(gè)探討js效率問(wèn)題的文章,其大概意思是說(shuō)方法2的效率高,其對(duì)比代碼如下:
復(fù)制代碼 代碼如下:
// 方法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);
}
其頁(yè)面中有:
<div id="container"></div>
<input type="button" value="start" onclick="init();" />
從執(zhí)行效果來(lái)看方案2要比方案1快10倍左右,到底這是不是真的呢?其實(shí)上面的測(cè)試代碼是有待商榷的,且看其方法1中的循環(huán)代碼:
復(fù)制代碼 代碼如下:
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;
}
其中有很多字符串操作,而且除了使用+號(hào)來(lái)連接字符串外,還使用了+=操作符,這就是問(wèn)題的所在了,在javascript中這種操作字符串的做法是嚴(yán)重影響效率的,所以使用上面的方法來(lái)測(cè)試createEmenent和innerHTML的效率對(duì)innerHTML是不公平的, 據(jù)此看來(lái)很可能是字符串操作吃掉了innerHTML的性能,于是寫(xiě)了下面的測(cè)試代碼:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
經(jīng)測(cè)試發(fā)現(xiàn):
1、在創(chuàng)建的對(duì)象較少(0-大約10左右)時(shí),innerHTML和createElement效率差不多,測(cè)試值悠忽不定;
2、在創(chuàng)建對(duì)象多于20時(shí),innerHTML要比createElement效率高很多,平均測(cè)試差不多createElement耗時(shí)是innerHTML的兩倍。
總結(jié):其實(shí)效率也在于編寫(xiě)的代碼,在知道可用的API的效率后,怎么編寫(xiě)代碼也是非常重要的,否則應(yīng)由的執(zhí)行效率不能體現(xiàn)出來(lái),就如上面從網(wǎng)上搜到的那些代碼,得出一個(gè)與事實(shí)相悖的結(jié)論。
您可能感興趣的文章:
- JavaScript動(dòng)態(tài)改變HTML頁(yè)面元素例如添加或刪除
- javascript 控制 html元素 顯示/隱藏實(shí)現(xiàn)代碼
- js實(shí)現(xiàn)創(chuàng)建刪除html元素小結(jié)
- JavaScript中獲取HTML元素值的三種方法
- JavaScript改變HTML元素的樣式改變CSS及元素屬性
- Js 獲取HTML DOM節(jié)點(diǎn)元素的方法小結(jié)
- js 動(dòng)態(tài)創(chuàng)建 html元素
- JS控制HTML元素的顯示和隱藏的兩種方法
- js獲取Html元素的實(shí)際寬度高度的方法
- JS獲取html元素的標(biāo)記名實(shí)現(xiàn)方法
- JS實(shí)現(xiàn)加載時(shí)鎖定HTML頁(yè)面元素的方法
相關(guān)文章
uniapp小程序點(diǎn)擊輸入框時(shí)阻止彈出軟鍵盤(pán)的幾種解決方案
在寫(xiě)項(xiàng)目時(shí)候需要在表單里面加一個(gè)picker選擇器,但選擇input的時(shí)候軟鍵盤(pán)與選擇器會(huì)同時(shí)彈出,下面這篇文章主要給大家介紹了關(guān)于uniapp小程序點(diǎn)擊輸入框時(shí)阻止彈出軟鍵盤(pán)的幾種解決方案,需要的朋友可以參考下2024-02-02在Html中使用Requirejs進(jìn)行模塊化開(kāi)發(fā)實(shí)例詳解
在前端模塊化的時(shí)候,不僅僅是js需要進(jìn)行模塊化管理,html有時(shí)候也需要模塊化管理。這里就介紹下如何通過(guò)requirejs,實(shí)現(xiàn)html代碼的模塊化開(kāi)發(fā)2016-04-04JavaScript如何將時(shí)間戳轉(zhuǎn)化為年月日時(shí)分秒格式
這篇文章主要給大家介紹了關(guān)于JavaScript如何將時(shí)間戳轉(zhuǎn)化為年月日時(shí)分秒格式的相關(guān)資料,在前端的日常工作當(dāng)中,時(shí)間戳的使用也是不少的,有時(shí)后端返回給我們的數(shù)據(jù)是一個(gè)時(shí)間戳,我們需要轉(zhuǎn)換成年月日,時(shí)分秒的形式展示在頁(yè)面當(dāng)中,需要的朋友可以參考下2023-11-11原生JS實(shí)現(xiàn)隨機(jī)點(diǎn)名項(xiàng)目的實(shí)例代碼
這篇文章主要介紹了原生JS實(shí)現(xiàn)隨機(jī)點(diǎn)名項(xiàng)目的實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2019-04-04微信小程序?qū)崿F(xiàn)同時(shí)上傳多張圖片
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)同時(shí)上傳多張圖片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02javascript DOM 操作基礎(chǔ)知識(shí)小結(jié)
經(jīng)常用到j(luò)avascript對(duì)dom,喜歡這方便的朋友也很多,要想更好的對(duì)dom進(jìn)行操作,這些基礎(chǔ)一定要知道的。2010-04-04