优化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 相关文章推荐
自己动手制作jquery插件之自动添加删除行的实现
Oct 13 Javascript
JavaScript显示当然日期和时间即年月日星期和时间
Oct 29 Javascript
一个JavaScript防止表单重复提交的实例
Oct 21 Javascript
javascript中call和apply的用法示例分析
Apr 02 Javascript
AngularJS中的路由使用及实现代码
Oct 09 Javascript
利用jqprint插件打印页面内容的实现方法
Jan 09 Javascript
react实现换肤功能的示例代码
Aug 14 Javascript
使用Object.defineProperty如何巧妙找到修改某个变量的准确代码位置
Nov 02 Javascript
Vue组件Draggable实现拖拽功能
Dec 01 Javascript
详解jquery和vue对比
Apr 16 jQuery
vue组件化中slot的基本使用方法
May 01 Javascript
keep-Alive搭配vue-router实现缓存页面效果的示例代码
Jun 24 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
咖啡界又出新概念,无需咖啡豆的分子咖啡
2021/03/03 咖啡文化
一些 PHP 管理系统程序中的后门
2009/08/05 PHP
ThinkPHP实现将本地文件打包成zip下载
2014/06/26 PHP
PHP中的Session对象如何使用
2015/09/25 PHP
PHP常用函数之格式化时间操作示例
2019/10/21 PHP
javascript parseInt与Number函数的区别
2010/01/21 Javascript
javascript实现简单加载随机色方块
2015/12/25 Javascript
Javascript中return的使用与闭包详解
2017/01/11 Javascript
vue-resourse将json数据输出实例
2017/03/08 Javascript
JS实现无缝循环marquee滚动效果
2017/05/22 Javascript
jquery 实现拖动文件上传加载进度条功能
2018/03/18 jQuery
React中使用UEditor百度富文本的方法
2018/08/22 Javascript
微信小程序登录session的使用
2019/03/17 Javascript
JavaScript JSON数据处理全集(小结)
2019/08/15 Javascript
微信小程序实现日历签到
2020/09/21 Javascript
[02:22]2018DOTA2亚洲邀请赛VG赛前采访
2018/04/03 DOTA
python实现在字符串中查找子字符串的方法
2015/07/11 Python
Python3实现发送QQ邮件功能(附件)
2020/12/23 Python
Python设计模式之中介模式简单示例
2018/01/09 Python
Python hashlib模块用法实例分析
2018/06/12 Python
python 限制函数执行时间,自己实现timeout的实例
2019/01/12 Python
python如何获取当前文件夹下所有文件名详解
2019/01/25 Python
html5使用canvas绘制太阳系效果
2014/12/15 HTML / CSS
马来西亚银饰品牌:JEOEL
2017/12/15 全球购物
美国Jeep配件购物网站:Morris 4×4 Center
2019/05/01 全球购物
建筑工程实习自我鉴定
2013/09/19 职场文书
员工考核评语大全
2014/04/26 职场文书
大学理论知识学习自我鉴定
2014/04/28 职场文书
小学生校园广播稿
2014/09/28 职场文书
教师批评与自我批评范文
2014/10/15 职场文书
学校勤俭节约倡议书
2015/04/29 职场文书
运动会开幕式致辞
2015/07/29 职场文书
导游词之无锡梅园
2019/11/28 职场文书
世界十大评分最高的动漫,CLANNAD上榜,第八赚足人们眼泪
2022/03/18 日漫
一文教你快速生成MySQL数据库关系图
2022/06/28 Redis
django项目、vue项目部署云服务器的详细过程
2022/07/23 Servers