优化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 相关文章推荐
js prototype截取字符串函数
Apr 01 Javascript
javascript学习笔记(七)利用javascript来创建和存储cookie
Apr 08 Javascript
Tab页界面 用jQuery及Ajax技术实现(php后台)
Oct 12 Javascript
浏览器窗口加载和大小改变事件示例
Feb 27 Javascript
javascript模拟map输出与去除重复项的方法
Feb 09 Javascript
jQuery+Ajax实现无刷新分页
Oct 30 Javascript
jQuery实现多级联动下拉列表查询框
Jan 18 Javascript
深入浅析AngularJS和DataModel
Feb 16 Javascript
利用Js+Css实现折纸动态导航效果实例源码
Jan 25 Javascript
JavaScript无缝滚动效果的实例代码
Mar 27 Javascript
Angular实现的简单定时器功能示例
Dec 28 Javascript
微信小程序获取用户绑定手机号方法示例
Jul 21 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
SONY SRF-40W电路分析
2021/03/02 无线电
MySql 按时间段查询数据方法(实例说明)
2008/11/02 PHP
PHP 万年历实现代码
2012/10/18 PHP
解析如何在PHP下载文件名中解决乱码的问题
2013/06/20 PHP
php计算整个mysql数据库大小的方法
2015/06/19 PHP
php实现Session存储到Redis
2015/11/11 PHP
php使用PDO事务配合表格读取大量数据插入操作实现方法
2017/02/16 PHP
php连接mysql数据库
2017/03/21 PHP
通过Javascript创建一个选择文件的对话框代码
2012/06/16 Javascript
node在两个div之间移动,用ztree实现
2013/03/06 Javascript
javascript动态向网页中添加表格实现代码
2014/02/19 Javascript
微信企业号开发之微信考勤百度地图定位
2015/09/11 Javascript
详解JavaScript数组和字符串中去除重复值的方法
2016/03/07 Javascript
vue中post请求以a=a&amp;b=b 的格式写遇到的问题
2018/04/27 Javascript
微信提示 在浏览器打开 效果实现过程解析
2019/09/10 Javascript
vue实现计算器功能
2020/02/22 Javascript
Python按行读取文件的简单实现方法
2016/06/22 Python
Django模板变量如何传递给外部js调用的方法小结
2017/07/24 Python
python中闭包Closure函数作为返回值的方法示例
2017/12/17 Python
python生成n个元素的全组合方法
2018/11/13 Python
利用python实现对web服务器的目录探测的方法
2019/02/26 Python
python批量下载抖音视频
2019/06/17 Python
python安装virtualenv虚拟环境步骤图文详解
2019/09/18 Python
浅谈tensorflow之内存暴涨问题
2020/02/05 Python
基于virtualenv创建python虚拟环境过程图解
2020/03/30 Python
django 将自带的数据库sqlite3改成mysql实例
2020/07/09 Python
如何利用pycharm进行代码更新比较
2020/11/04 Python
HTML5中微数据概述及在搜索引擎中的使用举例
2013/02/07 HTML / CSS
12个不为大家熟知的HTML5设计小技巧
2016/06/02 HTML / CSS
Java基础知识面试题
2014/03/25 面试题
仓库主管岗位职责
2014/03/02 职场文书
企业财务管理制度范本
2015/08/04 职场文书
新学期感想
2015/08/10 职场文书
个人的事迹材料怎么写
2019/04/24 职场文书
AJAX引擎原理以及XmlHttpRequest对象的axios、fetch区别详解
2022/04/09 Javascript
我去timi了,一起去timi是什么意思?
2022/04/13 杂记