优化innerHTML操作(提高代码执行效率)


Posted in Javascript onAugust 20, 2011

例子:我们要实现的效果是当用户点击鼠标的时候,就在旧数据上追加若干新数据。

如果使用标准DOM的话,完整代码如下:

<html> 
<head> 
<title>test</title> 
</head> 
<body> 
<div> 
<p>data<p> 
</div> 
<script> 
document.onmousedown = function() { 
for (var i = 0; i < 10; i++) { 
var p = document.createElement("p"); 
p.appendChild(document.createTextNode(Math.random())); 
document.getElementsByTagName('div')[0].appendChild(p); 
} 
}; 
</script> 
</body> 
</html>

注:一旦结构比较复杂的话,标准DOM需要编写冗长的代码。

如果使用innerHTML的话,部分代码如下:

<script> 
document.onmousedown = function() { 
var html = ""; 
for (var i = 0; i < 10; i++) { 
html += "<p>" + Math.random() + "<p>"; 
} 
document.getElementsByTagName('div')[0].innerHTML += html; 
}; 
</script>

注:innerHTML没有标准DOM中的appendChild,所以使用了『+=』的方式,效率低下。

我们可以结合使用innerHTML和标准DOM,这样二者的优点就兼得了,部分代码如下:

<script> 
document.onmousedown = function() { 
var html = ""; 
for (var i = 0; i < 10; i++) { 
html += "<p>" + Math.random() + "<p>"; 
} 
var temp = document.createElement("div"); 
temp.innerHTML = html; 
while (temp.firstChild) { 
document.getElementsByTagName('div')[0].appendChild(temp.firstChild); 
} 
}; 
</script>

注:创建一个元素,然后注入innerHTML,接着在元素上使用标准DOM操作。

还不算完,Asynchronous innerHTML给出了更强悍的解决方法,部分代码如下:

<script> 
document.onmousedown = function() { 
var html = ""; 
for (var i = 0; i < 10; i++) { 
html += "<p>" + Math.random() + "<p>"; 
} 
var temp = document.createElement('div'); 
temp.innerHTML = html; 
var frag = document.createDocumentFragment(); 
(function() { 
if (temp.firstChild) { 
frag.appendChild(temp.firstChild); 
setTimeout(arguments.callee, 0); 
} else { 
document.getElementsByTagName('div')[0].appendChild(frag); 
} 
})(); 
}; 
</script>

注:使用setTimeout防止堵塞浏览器,使用DocumentFragment减少渲染次数。

另:代码在拼接字符串时还可以更快,详见:Fastest way to build an HTML string。

Javascript 相关文章推荐
Javascript 面向对象 重载
May 13 Javascript
SyntaxHighlighter语法高亮插件使用说明
Aug 14 Javascript
分享一道笔试题[有n个直线最多可以把一个平面分成多少个部分]
Oct 12 Javascript
jquery特效 幻灯片效果示例代码
Jul 16 Javascript
js判断选择时间不能小于当前时间的示例代码
Sep 24 Javascript
JS无缝滚动效果实现方法分析
Dec 21 Javascript
原生js FileReader对象实现图片上传本地预览效果
Mar 27 Javascript
利用纯JS实现像素逐渐显示的方法示例
Aug 14 Javascript
详解Vue中使用Echarts的两种方式
Jul 03 Javascript
解决layui 复选框等内置控件不显示的问题
Aug 14 Javascript
Vue实现本地购物车功能
Dec 05 Javascript
Vue中rem与postcss-pxtorem的应用详解
Nov 20 Javascript
js中将URL中的参数提取出来作为对象的实现代码
Aug 16 #Javascript
兼容IE和Firefox的javascript获取iframe文档内容的函数
Aug 15 #Javascript
jquery jqPlot API 中文使用教程(非常强大的图表工具)
Aug 15 #Javascript
理清apply(),call()的区别和关系
Aug 14 #Javascript
纯JS实现的批量图片预览加载功能
Aug 14 #Javascript
javascript中关于执行环境的杂谈
Aug 14 #Javascript
js中字符替换函数String.replace()使用技巧
Aug 14 #Javascript
You might like
PHP中遍历stdclass object的实现代码
2011/06/09 PHP
php中session退出登陆问题
2014/02/27 PHP
PHP+MYSQL中文乱码问题
2015/07/01 PHP
分享php代码将360浏览器导出的favdb的sqlite数据库文件转换为html
2015/12/09 PHP
tp5.1 实现setInc字段自动加1
2019/10/18 PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
2019/12/20 PHP
利用location.hash实现跨域iframe自适应
2010/05/04 Javascript
JS链式调用的实现方法
2013/03/07 Javascript
MVVM模式中ViewModel和View、Model有什么区别?
2015/06/19 Javascript
微信小程序 生命周期详解
2016/10/12 Javascript
bootstrap中使用google prettify让代码高亮的方法
2016/10/21 Javascript
JavaScript 控制字体大小设置的方法
2016/11/23 Javascript
vue-video-player 通过自定义按钮组件实现全屏切换效果【推荐】
2018/08/29 Javascript
解决v-for中使用v-if或者v-bind:class失效的问题
2018/09/25 Javascript
vue-cli中vue本地实现跨域调试接口
2019/01/16 Javascript
原生js实现滑块区间组件
2021/01/20 Javascript
[16:27]DOTA2 HEROS教学视频教你分分钟做大人-艾欧
2014/06/11 DOTA
[01:48]DOTA2 2015国际邀请赛中国区预选赛第二日战报
2015/05/27 DOTA
linux系统使用python监控apache服务器进程脚本分享
2014/01/15 Python
Python描述器descriptor详解
2015/02/03 Python
python使用PIL模块实现给图片打水印的方法
2015/05/22 Python
老生常谈Python startswith()函数与endswith函数
2017/09/08 Python
Python爬取qq空间说说的实例代码
2018/08/17 Python
Django的models中on_delete参数详解
2019/07/16 Python
python 操作hive pyhs2方式
2019/12/21 Python
你需要学会的8个Python列表技巧
2020/06/24 Python
利用python绘制中国地图(含省界、河流等)
2020/09/21 Python
servlet面试题
2012/08/20 面试题
自考生自我鉴定范文
2013/10/01 职场文书
路政管理专业个人自荐信范文
2013/11/30 职场文书
做一个有道德的人活动方案
2014/08/25 职场文书
乡镇群众路线整改落实情况汇报
2014/10/28 职场文书
先进基层党组织材料
2014/12/25 职场文书
少年的你:世界上没有如果,要在第一次就勇敢的反抗
2019/11/20 职场文书
pytorch实现手写数字图片识别
2021/05/20 Python
使用CSS设置滚动条样式
2022/01/18 HTML / CSS