优化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 import css实例代码
Jul 18 Javascript
基于jquery的文本框与autocomplete结合使用(asp.net+json)
May 30 Javascript
一个简单的JS时间控件示例代码(JS时分秒时间控件)
Nov 22 Javascript
JavaScript+CSS控制打印格式示例介绍
Jan 07 Javascript
angular分页指令操作
Jan 09 Javascript
js, jQuery实现全选、反选功能
Mar 08 Javascript
ECMAscript 变量作用域总结概括
Aug 18 Javascript
Bootstrap 树控件使用经验分享(图文解说)
Nov 06 Javascript
Vue 页面状态保持页面间数据传输的一种方法(推荐)
Nov 01 Javascript
微信小程序功能之全屏滚动效果的实现代码
Nov 22 Javascript
在 Vue-CLI 中引入 simple-mock实现简易的 API Mock 接口数据模拟
Nov 28 Javascript
Vue 技巧之控制父类的 slot
Feb 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
php 保留小数点
2009/04/21 PHP
基于asp+ajax和数据库驱动的二级联动菜单
2010/05/06 PHP
PHP实现使用优酷土豆视频地址获取swf播放器分享地址
2014/06/05 PHP
PHP采集静态页面并把页面css,img,js保存的方法
2014/12/23 PHP
PHP explode()函数的几个应用和implode()函数有什么区别
2015/11/05 PHP
PHP5.5迭代生成器用法实例详解
2016/03/16 PHP
PHP实现大数(浮点数)取余的方法
2017/02/18 PHP
PHP实现合并两个排序链表的方法
2018/01/19 PHP
jquery 注意事项与常用语法小结
2010/06/07 Javascript
JQuery 返回布尔值Is()条件判断方法代码
2012/05/14 Javascript
纯js实现瀑布流展现照片(自动适应窗口大小)
2013/04/08 Javascript
JS控件ASP.NET的treeview控件全选或者取消(示例代码)
2013/12/16 Javascript
浅析JS中document对象的一些重要属性
2014/03/06 Javascript
探寻JavaScript中this指针指向
2016/04/23 Javascript
纯JS代码实现气泡效果
2016/05/04 Javascript
jQuery 获取select选中值及清除选中状态
2016/12/13 Javascript
Angular2 父子组件数据通信实例
2017/06/22 Javascript
基于打包工具Webpack进行项目开发实例
2018/05/29 Javascript
JS/HTML5游戏常用算法之碰撞检测 像素检测算法实例详解
2018/12/12 Javascript
使用异步组件优化Vue应用程序的性能
2019/04/28 Javascript
javascript创建元素和删除元素实例小结
2019/06/19 Javascript
vue 实现强制类型转换 数字类型转为字符串
2019/11/07 Javascript
[02:28]DOTA2亚洲邀请赛附加赛 RECAP赛事回顾
2015/01/29 DOTA
python使用mailbox打印电子邮件的方法
2015/04/30 Python
详解Python3.6的py文件打包生成exe
2018/07/13 Python
python对数组进行排序,并输出排序后对应的索引值方式
2020/02/28 Python
django restframework serializer 增加自定义字段操作
2020/07/15 Python
巴西最大的体育用品商城:Netshoes巴西
2016/11/29 全球购物
奥地利网上现代灯具和灯饰店:Lampenwelt.at
2018/01/29 全球购物
Grow Gorgeous美国官网:只要八天,体验唤醒毛囊后新生的茂密秀发
2018/06/04 全球购物
彩色的翅膀教学反思
2014/04/25 职场文书
品质标语大全
2014/06/21 职场文书
迎国庆演讲稿
2014/09/05 职场文书
民主评议政风行风活动心得体会
2014/10/29 职场文书
2014年行政人事工作总结
2014/12/09 职场文书
基于Redis位图实现用户签到功能
2021/05/08 Redis