浅谈如何提升JavaScript中DOM的运行速度

开发 后端
在Web开发中,JavaScript的一个很重要的作用就是对DOM进行操作,可你知道么?对DOM的操作是非常昂贵的,因为这会导致浏览器执行回流操作,而执行了过多的回流操作,你就会发现自己的网站变得越来越慢了,我们应该尽可能的减少DOM操作。本文将给出了一些指导性原则,比如在什么时候应该对DOM可以进行什么样的操作等。

我们都知道,DOM操作的效率是很低的,而且不是一般的慢,而且这也是引发性能问题的常见问题之一。为什么会慢呢?因为对DOM的修改为影响网页的用户界面,重绘页面是一项昂贵的操作。太多的DOM操作会导致一系列的重绘操作,为了确保执行结果的准确性,所有的修改操作是按顺序同步执行的。我们称这个过程叫做回流(reflow),同时这也是最昂贵的浏览器操作之一。回流操作主要会发生在几种情况下:

◆当对DOM节点执行新增或者删除操作时。

◆动态设置一个样式时(比如element.style.width="10px")。

◆当获取一个必须经过计算的尺寸值时,比如访问offsetWidth、clientHeight或者其他需要经过计算的CSS值(在兼容DOM的浏览器中,可以通过getComputedStyle函数获取;在IE中,可以通过currentStyle属性获取)。
解决问题的关键,就是限制通过DOM操作所引发回流的次数。大部分浏览器都不会在JavaScript的执行过程中更新DOM。相应的,这些浏览器将对对DOM的操作放进一个队列,并在JavaScript脚本执行完毕以后按顺序一次执行完毕。也就是说,在JavaScript执行的过程中,用户不能和浏览器进行互动,直到一个回流操作被执行。( 失控脚本对话框 会触发回流操作,因为他执行了一个中止JavaScript执行的操作,此时会对用户界面进行更新)

如果要减少由于DOM修改带来的回流操作,有两个基本的方法。***个就是在对当前DOM进行操作之前,尽可能多的做一些准备工作。一个经典的例子就是向document对象中添加很多DOM节点:

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

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

  1. var fragment = document.createDocumentFragment();  
  2. for (var i=0; i < items.length; i++){  
  3.     var item = document.createElement("li");  
  4.     item.appendChild(document.createTextNode("Option " + i);  
  5.     fragment.appendChild(item);  
  6. }  
  7. list.appendChild(fragment); 

经过调整的代码,只会修改一次当前DOM的结构,就在***一行,而在这之前,我们用文档碎片来保存那些中间结果。因为文档碎片没有任何可见内容,所以这类修改不会触发回流操作。实际上,文档碎片也不能被添加到DOM中,我们需要将它作为参数传给appendChild函数,而实际上添加的不是文档碎片本身,而是它下面的所有子元素。

【编辑推荐】

  1. JavaScript中关于 Cookie的详细介绍
  2. JavaScript中 confirm,alert,prompt的用法
  3. 基于JavaScript的REST 客户端框架
  4. 如何优化JavaScript脚 本的性能
  5. 用Javascript连接 Access数据库的方法
责任编辑:张燕妮 来源: blueidea
相关推荐

2024-09-27 08:35:33

数组JavaScript性能

2011-01-12 11:22:24

微软认证

2021-11-03 06:28:21

Python运行速度开发

2009-08-11 09:10:26

Windows 7系统提速

2022-02-23 10:54:37

电脑卡顿硬件

2018-08-02 16:17:34

Python 开发编程语言

2018-06-27 09:00:00

Linux运行速度CPU信息

2020-12-15 06:44:14

程序运行速度

2010-04-12 10:01:43

Windows 7运行速度

2016-02-22 09:27:18

2012-10-24 09:40:46

网络优化系统优化

2024-02-22 08:37:28

NodejsJavaScript运行

2020-05-21 16:19:43

iOS 13.5苹果运行速度

2010-09-08 16:50:11

JavaScriptDOM操作

2009-09-12 09:43:29

Windows 7系统优化

2013-07-08 11:16:05

Windows 7

2009-03-29 09:47:24

苹果Iphone移动OS

2011-05-30 13:28:00

PHP

2010-01-20 13:19:01

VB.NET错误处理

2010-05-10 13:21:16

Windows 7系统日志
点赞
收藏

51CTO技术栈公众号