因为对DOM的修改为影响网页的用户界面,重绘页面是一项昂贵的操作。太多的JavaScript DOM操作会导致一系列的重绘操作,为了确保执行结果的准确性,所有的修改操作是按顺序同步执行的。我们称这个过程叫做回流(reflow),同时这也是最昂贵的浏览器操作之一, 回流操作主要会发生在几种情况下: 当对DOM节点执行新增或者删除操作时。 动态设置一个样式时(比如element.style.width=”10px”)。 当获取一个必须经过计算的尺寸值时,比如访问offsetWidth、clientHeight或者其他需要经过计算的CSS值(在兼容DOM的浏览器中,可以通过getComputedStyle函数获取;在IE中,可以通过currentStyle属性获取)。

解决问题的关键,就是限制通过JavaScript DOM操作所引发回流的次数。大部分浏览器都不会在JavaScript的执行过程中更新DOM。相应的,这些浏览器将对对DOM的操作放进一个队列,并在JavaScript脚本执行完毕以后按顺序一次执行完毕。也就是说,在JavaScript执行的过程中,用户不能和浏览器进行互动,直到一个回流操作被执行。(失控脚本对话框会触发回流操作,因为他执行了一个中止JavaScript执行的操作,此时会对用户界面进行更新) 如果要减少由于DOM修改带来的回流操作,有两个基本的方法。第一个就是在对当前DOM进行操作之前,尽可能多的做一些准备工作。一个经典的例子就是向document对象中添加很多DOM节点:

for(var i = 0;i < items.length;i++){
var item=document.createElement("li");
item.appendChild(document.createTextNode("Option"+i);
list.appendChild(item);
}

这段代码的效率是很低的,因为他在每次循环中都会修改当前DOM结构。为了提高性能,我们需要将这个次数降到最低,对于这个案例来说,最好的办法是建立一个文档碎片(documentfragment),作为那些已创建元素元素的临时容器,最后一次将容器的内容直接添加到父节点中:

var fragment = document.createDocumentFragment();
for(vari=0;i < items.length;i++){
var item=document.createElement("li");
item.appendChild(document.createTextNode("Option"+i);
fragment.appendChild(item);
}
list.appendChild(fragment);

最新文章

  1. 强大的DOM变化观察者MutationObserver
  2. iOS-数据持久化-偏好设置
  3. JAVA CDI 学习(2) - Scope 生命周期
  4. play for scala 在模板中格式化Date
  5. 短作业优先调度算法(SJF)
  6. oracle数据库登录连接很慢;kettle连接oracle 报 IO 错误,socket time out 问题解决记录
  7. uva 10154
  8. SHH入门:Spring框架简介
  9. xcode6 中增加SDWebImage/SDWebImageDownloaderOperation.m报错解决方法
  10. PVST+(每个VLAN 的生成树PVST 加)
  11. 自己动手修改Robotium代码(上)
  12. pta-树种统计
  13. 三:OVS+GRE之完整网络流程
  14. Podfile语法参考
  15. c++重要知识点
  16. codeforces525B
  17. linux提取第一列且删除第一行(awk函数)
  18. Java集合—Set集和Map集
  19. hive之权限问题AccessControlException Permission denied: user=root, access=WR
  20. citus real-time 分析demo( 来自官方文档)

热门文章

  1. Nginx流量拷贝
  2. java静态方法调用非静态方法
  3. OC-引用计数器,内存管理,野指针
  4. 【Java 基础】Collectors 使用小结
  5. Linux 易错小结
  6. 使用缓冲流和byte数组,拷贝文件
  7. 【C/C++】拔河比赛/分组/招商银行
  8. 【科研工具】MathType7.2的安装破解与使用
  9. java多线程2:Thread中的方法
  10. java 图形化工具Swing 创建工具条