优化innerHTML操作(提高代码执行效率)

 更新时间:2011年08月20日 22:55:44   作者:  
多数现代浏览器都实现了innerHTML操作,它的方便性让我们爱不释手,但如果使用不当,很容易出现效率问题,本文通过一个例子来说明如何优化innerHTML操作。
例子:我们要实现的效果是当用户点击鼠标的时候,就在旧数据上追加若干新数据。
  如果使用标准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 编写枚举的最有效方法分享

    这篇文章主要介绍了JavaScript 编写枚举的最有效方法分享,JavaScript语言本身不支持枚举。如果我们想模拟枚举,我们可以使用一个对象。更多相关内容感兴趣的小伙伴可以参考一下
    2022-06-06
  • JavaScript表格隔行变色和Tab标签页特效示例【附jQuery版】

    JavaScript表格隔行变色和Tab标签页特效示例【附jQuery版】

    这篇文章主要介绍了JavaScript表格隔行变色和Tab标签页特效,结合实例形式分析了javascript元素遍历、事件响应相关操作技巧,并附带jQuery对应实现代码供大家参考,需要的朋友可以参考下
    2019-07-07
  • uniapp实现全局设置字体大小(小中大的字体切换)

    uniapp实现全局设置字体大小(小中大的字体切换)

    随着UniApp的流行,越来越多的开发者选择使用它来构建跨平台应用程序,下面这篇文章主要给大家介绍了关于uniapp实现全局设置字体大小(小中大的字体切换)的相关资料,需要的朋友可以参考下
    2023-06-06
  • 深入浅出JavaScript中base64编码原理

    深入浅出JavaScript中base64编码原理

    今天翻开旧项目发现挺多图片相关的插件都是用 base64 来显示图片的。谈到 base64,脑海遐想翩翩,思绪回荡之下 base64 瑕瑜互见。这篇文章主要是记录了工作中遇见的问题并加以总结,如有不妥请指正
    2023-02-02
  • JavaScript实现简单轮播图效果

    JavaScript实现简单轮播图效果

    这篇文章主要为大家详细介绍了JavaScript实现图片轮播,左右翻转,图片切换显示等效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • Bootstrap 模态对话框只加载一次 remote 数据的完美解决办法

    Bootstrap 模态对话框只加载一次 remote 数据的完美解决办法

    前端框架 Bootstrap 的模态对话框,可以使用 remote 选项指定一个 URL,这样对话框在第一次弹出的时候就会自动从这个地址加载数据到 .modal-body 中,但是它只会加载一次,不过通过在事件中调用 removeData() 方法可以解决这个问题,具体操作方法,大家通过本文了解下吧
    2017-07-07
  • javascript 节点遍历函数

    javascript 节点遍历函数

    火狐官网上找到的一组函数,相当于treeWalker,有了它可以方便地在IE实现Traversal API 2的所有功能
    2010-03-03
  • JavaScript几种形式的树结构菜单

    JavaScript几种形式的树结构菜单

    今天我主要讲3种不同展示的JavaScript树结构菜单,分别是悬浮层树(Tree)、右键菜单树(ContextMenu)和节点树(TreeMenu),目前都支持无限级层次。
    2010-05-05
  • JavaScript实现三阶幻方算法谜题解答

    JavaScript实现三阶幻方算法谜题解答

    这篇文章主要介绍了JavaScript实现三阶幻方算法谜题解答,三阶幻方是指试将1~9这9个不同整数填入一个3×3的表格,使得每行、每列以及每条对角线上的数字之和相同,需要的朋友可以参考下
    2014-12-12
  • js利用正则表达式检验输入内容是否为网址

    js利用正则表达式检验输入内容是否为网址

    这篇文章主要为大家详细介绍了js利用正则表达式检验输入内容是否为网址的相关方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-07-07

最新评论