优化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 相关文章推荐
[IE&amp;FireFox兼容]JS对select操作
Jan 07 Javascript
javascript 事件处理、鼠标拖动效果实现方法详解
May 11 Javascript
动态加载js和css(外部文件)
Apr 17 Javascript
js清空表单数据的两种方式(遍历+reset)
Jul 18 Javascript
对Web开发中前端框架与前端类库的一些思考
Mar 27 Javascript
jQuery链式调用与show知识浅析
May 11 Javascript
解析JavaScript数组方法reduce
Dec 12 Javascript
关于javascript事件响应的基础语法总结(必看篇)
Dec 26 Javascript
激动人心的 Angular HttpClient的源码解析
Jul 10 Javascript
策略模式实现 Vue 动态表单验证的方法
Sep 16 Javascript
JavaScript实现商品评价五星好评
Nov 30 Javascript
React如何使用axios请求数据并把数据渲染到组件
Aug 05 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实现查询百度google收录情况(示例代码)
2013/08/02 PHP
深入解析php中的foreach函数
2013/08/31 PHP
php内核解析:PHP中的哈希表
2014/01/30 PHP
详解php中 === 的使用
2016/10/24 PHP
PHP利用二叉堆实现TopK-算法的方法详解
2017/04/24 PHP
VS2008中使用JavaScript调用WebServices
2014/12/18 Javascript
jQuery修改class属性和CSS样式整理
2015/01/30 Javascript
简单谈谈Vue 模板各类数据绑定
2016/09/25 Javascript
javaScript之split与join的区别(详解)
2017/11/08 Javascript
Vue组件和Route的生命周期实例详解
2018/02/10 Javascript
手动用webpack搭建第一个ReactApp的示例
2018/04/11 Javascript
详解webpack运行Babel教程
2018/06/13 Javascript
vue将单页面改造成多页面应用的方法
2018/11/25 Javascript
vue 双向数据绑定的实现学习之监听器的实现方法
2018/11/30 Javascript
Vue.js中provide/inject实现响应式数据更新的方法示例
2019/10/16 Javascript
如何使用 JavaScript 操作浏览器历史记录 API
2020/11/24 Javascript
JavaScript实现页面高亮操作提示和蒙板
2021/01/04 Javascript
python3.3使用tkinter开发猜数字游戏示例
2014/03/14 Python
Python创建普通菜单示例【基于win32ui模块】
2018/05/09 Python
python创造虚拟环境方法总结
2019/03/04 Python
python数据持久存储 pickle模块的基本使用方法解析
2019/08/30 Python
解决pyecharts运行后产生的html文件用浏览器打开空白
2020/03/11 Python
python 6行代码制作月历生成器
2020/09/18 Python
Columbia美国官网:美国著名的户外服装品牌
2016/11/24 全球购物
图库照片、免版税图片、矢量艺术、视频片段:Depositphotos
2019/08/02 全球购物
先进集体事迹材料
2014/02/17 职场文书
会计电算化专业自荐信
2014/03/15 职场文书
信访工作经验交流材料
2014/05/23 职场文书
奉献爱心演讲稿
2014/09/04 职场文书
社区务虚会发言材料
2014/10/20 职场文书
惹女朋友生气检讨书
2015/05/06 职场文书
刑事申诉状范文
2015/05/20 职场文书
2015团员个人年度总结
2015/11/24 职场文书
2016高三毕业赠言寄语
2015/12/04 职场文书
2016大学生就业指导课心得体会
2016/01/15 职场文书
centos8安装nginx1.9.1的详细过程
2021/08/02 Servers