innerHTML的性能问题
并且给出了一个replaceHTML的函数
- function replaceHtml(el, html) {
- var oldEl = typeof el === "string" ? document.getElementById(el) : el;
- /*@cc_on // Pure innerHTML is slightly faster in IE
- oldEl.innerHTML = html;
- return oldEl;
- @*/
- var newEl = oldEl.cloneNode(false);
- newEl.innerHTML = html;
- oldEl.parentNode.replaceChild(newEl, oldEl);
- /* Since we just removed the old element from the DOM, return a reference
- to the new element, which can be used to restore variable references. */
- return newEl;
- };
function replaceHtml(el, html) {
	var oldEl = typeof el === "string" ? document.getElementById(el) : el;
	/*@cc_on // Pure innerHTML is slightly faster in IE
		oldEl.innerHTML = html;
		return oldEl;
	@*/
	var newEl = oldEl.cloneNode(false);
	newEl.innerHTML = html;
	oldEl.parentNode.replaceChild(newEl, oldEl);
	/* Since we just removed the old element from the DOM, return a reference
	to the new element, which can be used to restore variable references. */
	return newEl;
};
用这个函数来代替innerHTML后在不同浏览器中的性能表现为: 
Safari 3: 
5000 elements… 
innerHTML (destroy only): 63ms 
innerHTML (create only): 390ms 
innerHTML (destroy & create): 484ms 
replaceHtml (destroy only): 47ms (1.3x faster) 
replaceHtml (create only): 15ms (26.0x faster) 
replaceHtml (destroy & create): 62ms (7.8x faster) 
Done. 
10000 elements… 
innerHTML (destroy only): 110ms 
innerHTML (create only): 3500ms 
innerHTML (destroy & create): 4735ms 
replaceHtml (destroy only): 110ms (~ same speed) 
replaceHtml (create only): 31ms (112.9x faster) 
replaceHtml (destroy & create): 141ms (33.6x faster) 
Done.
Firefox 3: 
5000 elements… 
innerHTML (destroy only): 863ms 
innerHTML (create only): 522ms 
innerHTML (destroy & create): 1421ms 
replaceHtml (destroy only): 20ms (43.1x faster) 
replaceHtml (create only): 225ms (2.3x faster) 
replaceHtml (destroy & create): 239ms (5.9x faster) 
Done. 10000 elements… 
innerHTML (destroy only): 5521ms 
innerHTML (create only): 2626ms 
innerHTML (destroy & create): 8528ms 
replaceHtml (destroy only): 39ms (141.6x faster) 
replaceHtml (create only): 373ms (7.0x faster) 
replaceHtml (destroy & create): 422ms (20.2x faster) 
Done.
Opera 9.5: 
5000 elements… 
innerHTML (destroy only): 16ms 
innerHTML (create only): 141ms 
innerHTML (destroy & create): 94ms 
replaceHtml (destroy only): 16ms (~ same speed) 
replaceHtml (create only): 78ms (1.8x faster) 
replaceHtml (destroy & create): 125ms (1.3x slower) 
Done. 
10000 elements… 
innerHTML (destroy only): 31ms 
innerHTML (create only): 156ms 
innerHTML (destroy & create): 312ms 
replaceHtml (destroy only): 31ms (~ same speed) 
replaceHtml (create only): 203ms (1.3x slower) 
replaceHtml (destroy & create): 157ms (2.0x faster) 
Done.
IE7: 
1000 elements… 
innerHTML (destroy only): 0ms 
innerHTML (create only): 0ms 
innerHTML (destroy & create): 0ms 
replaceHtml (destroy only): 0ms (~ same speed) 
replaceHtml (create only): 0ms (~ same speed) 
replaceHtml (destroy & create): 0ms (~ same speed) 
Done. 
15000 elements… 
innerHTML (destroy only): 31ms 
innerHTML (create only): 156ms 
innerHTML (destroy & create): 172ms 
replaceHtml (destroy only): 32ms (~ same speed) 
replaceHtml (create only): 157ms (~ same speed) 
replaceHtml (destroy & create): 188ms (1.1x slower) 
Done.
似乎在IE上没有什么改进,但是在其它浏览器上效果明显。
经常使用的prototype.js里是调用Element.update(element,content)来完成innerHTML操作的,打开prototype.js文件,修改update的部分
- update: function(element, content) {
- element = $(element);
- if (content && content.toElement) content = content.toElement();
- if (Object.isElement(content)) return element.update().insert(content);
- content = Object.toHTML(content);
- element.innerHTML = content.stripScripts();
- content.evalScripts.bind(content).defer();
- return element;
- },
update: function(element, content) {
    element = $(element);
    if (content && content.toElement) content = content.toElement();
    if (Object.isElement(content)) return element.update().insert(content);
    content = Object.toHTML(content);
    element.innerHTML = content.stripScripts();
    content.evalScripts.bind(content).defer();
    return element;
  },
用replaceHTML函数代替element.innerHTML = content.stripScripts();这行就可以了。
- update: function(element, content) {
- element = $(element);
- if (content && content.toElement) content = content.toElement();
- if (Object.isElement(content)) return element.update().insert(content);
- content = Object.toHTML(content);
- element = replaceHtml(element, content.stripScripts());
- content.evalScripts.bind(content).defer();
- return element;
- },
update: function(element, content) {
    element = $(element);
    if (content && content.toElement) content = content.toElement();
    if (Object.isElement(content)) return element.update().insert(content);
    content = Object.toHTML(content);
    element = replaceHtml(element, content.stripScripts());
    content.evalScripts.bind(content).defer();
    return element;
  },
innerHTML的性能问题的更多相关文章
- 浅析 innerHTML 性能优化的原理
		浅析 innerHTML 性能优化的原理 博客分类: web前端 IEAndroidwebkit浏览器UI 昨天看了 lveyo老兄的"innerHTML的性能问题" 一文 ht ... 
- Javascript与当前项目的思考
		主体 分为以下三部分,能力.经验有限,欢迎拍砖. 1.低效的代码 2.面向对象的重构重复利用代码 3.调试的经验总结 第一部分 日常中低效的代码 加载和运行 <html> <he ... 
- 【转载】Dom篇
		一. 初探Dom 1. Dom介绍 二. Dom基础 1. window顶级对象 2. body.document对象事件 3. 通用的HTML元素的事件 4. ... 
- 一周一话题之四(JavaScript、Dom、jQuery全面复习总结<Dom篇>)
		-->目录导航 一. 初探Dom 1. Dom介绍 二. Dom基础 1. window顶级对象 2. body.document对象事件 3. 通用的HTML元素的事件 4. 冒泡事件 5. ... 
- JS学习之路,菜鸟总结的注意事项及错误更正
		JavaScript 是一种面向对象的动态语言,它的语法来源于 Java 和 C,所以这两种语言的许多语法特性同样适 用于 JavaScript.需要注意的一个主要区别是 JavaScript 不支持 ... 
- web前端 DOM 详解
		先来点概念 文档对象模型(DOM)是一个独立于语言的,使用 XML 和 HTML 文档操作的应用程序接口(API). 在浏览器中,主要与 HTML 文档打交道,在网页应用中检索 XML 文档也很常见. ... 
- javascript DOM操作中的insertAdjacentHTML方法
		插入HTML内容与文本内容以前用的是innerHTML与innerText方法,今天看到insertAdjacentHTML和 insertAdjacentText两个API,特地学习一下: inse ... 
- 高性能Javascript(2) DOM编程
		第三部分 DOM编程 文档对象模型(DOM)是一个独立于语言的,使用XML和HTML文档操作的应用程序接口(API).在浏览器中,主要与HTML文档打交道,在网页应用中检索XML文档也很常见.DOM ... 
- 《编写高质量代码改善JavaScript程序的188个建议》读书笔记
		逗号运算符比较怪异.如 var a =(1,2,3,4);alert(a);// 4 var a = 1,2,3,4;//报错 注意a++和++a的差别,变量在参与运算中不断地变化.v ... 
随机推荐
- Spss22安装与破解教程
			Spss22安装与破解教程 Spss22安装与破解教程 1.下载安装包 可以去IBM官网.人大论坛等网站下载,全部文件应包括spss22安装包(含32位及64位)和破解文件,这里提供一个64位的百度网 ... 
- 使用lsyncd配置数据库备份多异地同步
			lsyncd配置文件 settings { logfile = "/var/log/lsyncd.log", --日志路径 status = "/var/log/lsyn ... 
- vue 随笔3
			在整个vue项目中index.js只能有一个 ,创建vue组件实例的代码只能写在main.js中或者index.js中,别的文件中都是使用export default 常量 或者是方法 
- File System Programming --- (一)
			About Files and Directories The file system is an important part of any operating system. After all, ... 
- ASP.NET Core MVC 2.x 全面教程_ASP.NET Core MVC 23. 继续讲Tag Helpers 和复习View Component
			当条件为true就渲染,否则就不渲染 ‘ 判断用户的登陆 更好的一点是做一个TagHelper.把这些明显的C#代码都去掉.最终都是用html和属性的形式来组成一个最终的代码 属性名称等于Confit ... 
- UVa 11040 Add bricks in the wall (水题递推)
			题意:给定一个金字塔,除了最后一行,每个数都等于支撑它的两个数的和,现在给奇数行的左数奇数位置,求整个金字塔. 析:很容易看出来,从下往上奇数行等于 a[i][j] = (a[i-2][j-1] - ... 
- UVaLive 6950 && Gym  100299K Digraphs (DFS找环或者是找最长链)
			题意:有n个只包含两个字母的字符串, 要求构造一个m*m的字母矩阵, 使得矩阵的每行每列都不包含所给的字符串, m要尽量大, 如果大于20的话构造20*20的矩阵就行了. 析:开始吧,并没有读对题意, ... 
- UVaLive 6588 && Gym 100299I (贪心+构造)
			题意:给定一个序列,让你经过不超过9的6次方次操作,变成一个有序的,操作只有在一个连续区间,交换前一半和后一半. 析:这是一个构造题,我们可以对第 i 个位置找 i 在哪,假设 i 在pos 位置, ... 
- 实现node端渲染图表的简单方案
			实现node端渲染图表的简单方案 这个题目有点小,本篇博客真正谈论的应该是服务端生成图表的简单方案,这里面有两个关键字:服务端 & 简单,我们知道基于js有很多的图表库,知名的如D3.echa ... 
- mq4参考
			更新: 2017/05/24 其实也就是照搬文档,主要是用到一个记一个.方便掌握 ----------------------------------------------------------- ... 
