优化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 UI Autocomplete 1.8.16 中文输入修正代码
Apr 16 Javascript
对frameset、frame、iframe的js操作示例代码
Aug 16 Javascript
JS仿百度搜索自动提示框匹配查询功能
Nov 21 Javascript
全面兼容的javascript时间格式化函数(比较实用)
May 14 Javascript
基于Jquery实现仿百度百科右侧导航代码附源码下载
Nov 27 Javascript
JS+CSS实现的漂亮渐变背景特效代码(6个渐变效果)
Mar 25 Javascript
js实现自定义进度条效果
Mar 15 Javascript
js实现简单选项卡功能
Mar 23 Javascript
Node.js中Koa2在控制台输出请求日志的方法示例
May 02 Javascript
详解ES6 Promise的生命周期和创建
Aug 18 Javascript
JavaScript创建、读取和删除cookie
Sep 03 Javascript
javaScript实现一个队列的方法
Jul 14 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
提问的智慧(2)
2006/10/09 PHP
Cygwin中安装PHP方法步骤
2015/07/04 PHP
PHP实现图的邻接矩阵表示及几种简单遍历算法分析
2017/11/24 PHP
根据地区不同显示时间的javascript代码
2007/08/13 Javascript
JavaScript OOP面向对象介绍
2010/12/02 Javascript
使用js在页面中绘制表格核心代码
2013/09/16 Javascript
jquery.post用法关于type设置问题补充
2014/01/03 Javascript
window.open不被拦截的简单实现代码(推荐)
2016/08/04 Javascript
Vue + Webpack + Vue-loader学习教程之功能介绍篇
2017/03/14 Javascript
jQuery实现鼠标经过显示动画边框特效
2017/03/24 jQuery
详解webpack+vue-cli项目打包技巧
2017/06/17 Javascript
jQuery Ajax 实现分页 kkpager插件实例代码
2017/08/10 jQuery
浅谈Vue的加载顺序探讨
2017/10/25 Javascript
利用jQuery+localStorage实现一个简易的计时器示例代码
2017/12/25 jQuery
详解webpack 热更新优化
2018/09/13 Javascript
对Python进行数据分析_关于Package的安装问题
2017/05/22 Python
Python实现的弹球小游戏示例
2017/08/01 Python
用Python一键搭建Http服务器的方法
2018/06/01 Python
解决Python 中英文混输格式对齐的问题
2018/07/16 Python
Python3删除排序数组中重复项的方法分析
2019/01/31 Python
PyQt5 QTable插入图片并动态更新的实例
2019/06/18 Python
python射线法判断一个点在图形区域内外
2019/06/28 Python
如何基于Python制作有道翻译小工具
2019/12/16 Python
python使用信号量动态更新配置文件的操作
2020/04/01 Python
Python实现播放和录制声音的功能
2020/08/12 Python
python 下载文件的多种方法汇总
2020/11/17 Python
HTML5 与 XHTML2
2008/10/17 HTML / CSS
前端使用canvas生成盲水印的加密解密的实现
2020/12/16 HTML / CSS
美国知名的时尚购物网站:Anthropologie
2016/12/22 全球购物
教师的实习鉴定
2013/12/15 职场文书
商务会议邀请函
2014/01/09 职场文书
学生操行评语大全
2014/04/24 职场文书
计算机软件专业求职信
2014/06/10 职场文书
村长反四风问题个人对照检查材料
2014/09/21 职场文书
慰问信格式规范
2015/03/23 职场文书
导师工作推荐信
2015/03/27 职场文书