优化DOM交互
DOM操作与交互要消耗大量时间,所以优化DOM交互有重大意义。
1、最小化现场更新
如果需要访问的DOM部分是已经显示的页面的一部分,那么这就是在进行一个现场更新。现场更新得越多,代码完成执行所需要的时间越多;完成一个操作所需要的 现场更新次数越少,则代码执行得越快。
下面是反模式例子:
 var list = document.getElementById("myList"),
        item,
        i;
    for(i=0;i<10;i++){
        item = document.createElement("li");
        list.appendChild(item);
        item.appendChild(document.createTextNode("Item"+i));
    }
在上面的例子中每次循环进行了两次的现场更新,一共进行了20次的现场更新,在每次的现场更新中,浏览器都需要重新计算无数尺寸进行更新。改进方法如下,使用createDocumentFragment文档片段来构建DOM结构,可以看作是一种“虚拟内存”。
 var list = document.getElementById("myList"),
        fragment = document.createDocumentFragment(),
        item,
        i;
    for(i=0;i<10;i++){
        item = document.createElement("li");
        fragment.appendChild(item);
        item.appendChild(document.createTextNode("item"+i));
    }
    list.appendChild(fragment);
在上面的方法中,只进在list.appendChild(fragment)中进行了一次的现场更新,故此性能更优。
2、使用innerHTML
使用innerHTML要比使用标准的DOM方法创建同样多的DOM结构要来的快。
将前面的第一个例子改写如下:
var list = document.getElementById("myList"),
    html = "",
    i;
for (i = 0; i < 10; i++) {
    html += "<li>Item " + i + "</li>";
}
list.innerHTML = html;
虽然字符串的连接存在性能的损失,但是这种方式还是要比进行多个DOM操作来得快。
3、使用事件代理
页面上的事件处理程序的数量与页面响应用户交互的速度成负相关。可以使用事件冒泡的方法,在祖先上注册事件处理程序,从而减少其数量。
4、注意HTMLCollection的使用
时刻注意要减少HTMLCollection集合的访问次数。例如可以把将长度计算移到for循环的初始化部分,在for循环中保存需要访问的HTMLCollection元素。
例子:
var images = document.getElementById("img"),
    image,
    i,len;
for(i=0,len=images.length;i<len;i++){
    image = images[i];
    //进行更多的处理
}
以上内容参考《javascript高级程序设计》
优化DOM交互的更多相关文章
- JavaScript之优化DOM
		优化DOM得从重绘和重排讲起,long long ago... 1.重绘和重排 1.1 重绘和重排是什么 重绘是指一些样式的修改,元素的位置和大小都没有改变: 重排是指元素的位置或尺寸发生了变化,浏览 ... 
- 一步一步学Silverlight 2系列(20):如何在Silverlight中与HTML DOM交互(下)
		述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ... 
- 一步一步学Silverlight 2系列(19):如何在Silverlight中与HTML DOM交互(上)
		概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ... 
- JS性能优化——DOM编程
		浏览器中的DOM 天生就慢 DOM是个与语言无关的API,它在浏览器中的接口却是用JavaScript实现的.客户端脚本编程大多数时候是在个底层文档打交道,DOM就成为现在JavaScript编码中 ... 
- JavaScript性能优化 DOM编程
		最近在研读<高性能JavaScript>,在此做些简单记录.示例代码可在此处查看到. 一.DOM 1)DOM和JavaScript 文档对象模型(DOM)是一个独立于语言的,用于操作XML ... 
- web前端优化--DOM性能优化
		1.DOM访问与修改的优化: DOM访问是有代价的,修改DOM则会引起DOM的重绘与重排,而这两种操作会消耗性能. (1)缓存DOM:将频繁访问的对象或属性使用变量缓存起来,每次访问的时候,直接使用变 ... 
- React.js 小书 Lesson3 - 前端组件化(二):优化 DOM 操作
		作者:胡子大哈 原文链接:http://huziketang.com/books/react/lesson3 转载请注明出处,保留原文链接和作者信息. 看看上一节我们的代码,仔细留意一下 change ... 
- 前端组件化(二):优化 DOM 操作
		看看上一节我们的代码,仔细留意一下 changeLikeText 函数,这个函数包含了 DOM 操作,现在看起来比较简单,那是因为现在只有 isLiked 一个状态.由于数据状态改变会导致需要我们去更 ... 
- 【react-router】从Link组件和a标签的区别说起,react-router如何实现导航并优化DOM性能?
		(注:参考自官方英文文档V3.X版本) react-router是伴随着react框架出现的路由系统,它也是公认的一种优秀的路由解决方案.在使用react-router时候,我们常常会使用其自带的路径 ... 
随机推荐
- iscroll源码初涉
			最近尝试做web app时候,用上了神器iScroll,鉴于功力尚浅,并没有完全用好神器,所以今天特意来认真学习! 翻开官网,目前的版本是5,但是相关的文章并不多,具体的文件版本是: iscroll. ... 
- hdu 5305Friends
			题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5305 Problem Description There are n people and m pai ... 
- 用jquery可以用使用serialize()序列化表单值,那有没有什么方法可以将值填充到表单中呢? (一段不错的代码)
			serialize()的作用,是生成一个类似这种格式的字符串用于ajax提交 a=&b=&c=.你想将值填写到表单,首先要有值,然后就是表单控件的id或者能唯一定位控件的属性.然后就$ ... 
- IOS APP配置.plist汇总(转自coolweather )
			IOS APP配置.plist汇总(转自coolweather ) 此文转自http://www.cocoachina.com/bbs/read.php?tid=89684&page=1 作者 ... 
- Android provider authorities冲突
			在Android项目中的AndroidManifest中provider的authorities相当于一个系统级的全局变量它的值必须唯一,如果有两个应用的authorities相同会导致安装失败. 
- 2014年总结:我的IT路
			又是一年春节时,转眼之间已经毕业4年,简单回顾一下这几年的职业生涯,希望大家提出宝贵意见. 大学时,几个同学跟着学校网络中心的老师一块做校园网上运行的小系统.偶尔协助一下老师对学校机房.校园网做一下维 ... 
- LeetCode_Sum Root to Leaf Numbers
			Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number ... 
- LeetCode_Flatten Binary Tree to Linked List
			Given a binary tree, flatten it to a linked list in-place. For example, Given 1 / \ 2 5 / \ \ 3 4 6 ... 
- 《Programming WPF》翻译 第9章 2.选择一个基类
			原文:<Programming WPF>翻译 第9章 2.选择一个基类 WPF提供了很多类,当创建一个自定义元素时,你可以从这些类中派生.图9-1显示了一组可能作为类--可能是合适的基类, ... 
- .net  中的DllImport
			只有做成COM的C++ dll才能直接引用.没有做成COM的就只能用P/Invoke(DllImport)或者C++/CLI那种.不过P/Invoke容易类型对不上,所以要是函数多,最好用C++/CL ... 
