在进行DOM优化时需要关注的问题有:修改DOM的时候,会引起页面的重排,重绘。因为JS是单线程执行的,那么在重排重绘的过程中可能会阻塞用户的操作。为了更好的用户体验,必须要严格控制这些操作。

一、对象集合 NodeList
当我们调用:getElementsByTagName,getElementsByName,getElementsByClassName的时候,返回的结果是一个NodeList,这个NodeList是实时的。如果你修改对应的html,那么NodeList中也会得到修改。
而且,NodeList的length属性是指访问NodeList的那一刻,其中包含的节点数量。
所以当下面这个代码运行时有可能会导致死循环(这里先不讨论在一个循环里多次调用appendChild方法):
 var divList = document.getElementsByTagName("div");
for( var i = 0; i < divList.length ; i++ ){
var d = document.createElement("div");
document.body.appendChild(d);
console.log(i);
}
因为当i增加的时候,divList.length也一直在以相同的速度增加,所以当文档中原本的<div>的数量 大于等于 1时,i永远不可能等于divList.length。运行代码的时候,你的页面甚至有可能会显示不出这些div,但是你可以通过控制台打印i的值观察其执行的次数。
所以,永远不要写这样的代码,但是你可以像下面这样子写:
 var divList = document.getElementsByTagName("div");
for( var i = 0, len = divList.length ; i < len ; i++ ){
var d = document.createElement("div");
document.body.appendChild(d);
console.log(i);
}
我们还可以通过一些方法将NodeList转换成普通数组,然后在对其进行操作:
var arrayOfNodes = Array.prototype.slice.call(divList,0);
但是这个方法在IE8及IE之前的版本无效,因为IE8之前将NodeList实现为COM对象,如果真的需要大量用到这个NodeList,并且在IE8和IE之前版本中,那么只好遍历了。
 
二、对DOM进行一些样式的修改
当修改元素的CSS属性时,如果涉及到很多CSS属性,那么不妨考虑增加一个CSS class,然后通过改变元素节点的class来实现这个目的。
修改前:
 element.style.cssText += "width:200px;height:200px;background-color:red;border:1px solid white";
修改后:
在css文件中增加一个样式:
 .active{
width:200px;
height:200px;
background-color:red;
border:1px solid white;
}
在JS中这样写:
 element.className += " active"
 
三、节点增加、移除
比如在一个文档中有一些比较复杂的DOM树需要进行大量的渲染操作,那我们可以先设置其隐藏,让其脱离文档流,等到相应的改变做完之后,再将其显示,使其加入到文档流中。这样做的好处是不会在页面上出现“运行一点,渲染一点”的情况,而是“先运行全部”,“再渲染全部”,从而提高了效率。
 
最后对于上面曾提到的:多次调用appendChild方法导致的多次重排,重绘。可以通过:document.createDocumentFragment()解决这个问题:
 var divList = document.getElementsByTagName("div"),
tempFragment = document.createDocumentFragment();
for( var i = 0; i < 100 ; i++ ){
var d = document.createElement("div");
d.className += " active"
tempFragment.appendChild(d);
}
document.body.appendChild(tempFragment);
 

更多内容参考:《高性能JavaScript一书》

一些JavaScript中的DOM的优化小技巧的更多相关文章

  1. 【前端】javascript中10常用的个小技巧总结

    javascript中10常用的个小技巧总结 本文转自:http://www.cnblogs.com/libin-1/p/6756393.html 1. new Set() 可能有人知道ES6中提供了 ...

  2. javascript中关于&& 和 || 表达式的小技巧分享

    如果你还是新手, 而且读完所有这些技巧的详解和每种技巧是如果工作的以后运用它们, 你会写出更加简练高效的JavaScript程序. 确实, JavaScript高手已经运用这些技巧写出了很多强大, 高 ...

  3. 借助JavaScript中的Dom属性改变Html中Table边框的颜色

    借助JavaScript中的Dom属性改变Html中Table边框的颜色 -------------------- <html> <head> <title>我是页 ...

  4. JavaScript中的尾调用优化

    文章来源自:http://www.zhufengpeixun.com/qianduanjishuziliao/javaScriptzhuanti/2017-08-08/768.html JavaScr ...

  5. javascript中获取dom元素的高度和宽度

    javascript中获取dom元素高度和宽度的方法如下: 网页可见区域宽: document.body.clientWidth网页可见区域高: document.body.clientHeight网 ...

  6. javascript中获取dom元素高度和宽度

    javascript中获取dom元素高度和宽度的方法如下: 网页可见区域宽: document.body.clientWidth网页可见区域高: document.body.clientHeight网 ...

  7. js | javascript中获取dom元素的高度和宽度

    javascript中获取dom元素高度和宽度的方法如下: 网页可见区域宽: document.body.clientWidth网页可见区域高: document.body.clientHeight网 ...

  8. 嵌入式C语言优化小技巧

    嵌入式C语言优化小技巧 1 概述 嵌入式系统是指完成一种或几种特定功能的计算机系统,具有自动化程度高,响应速度快等优点,目前已广泛应用于消费电子,工业控制等领域.嵌入式系统受其使用的硬件以及运行环境的 ...

  9. .NET性能优化小技巧

    .NET 性能优化小技巧 Intro 之前做了短信发送速度的提升,在大师的指导下,发送短信的速度有了极大的提升,学到了一些提升 .NET 性能的一些小技巧 HttpClient 优化 关于使用 Htt ...

随机推荐

  1. unrar.dll 使用实例

    /* * main.cpp * * Created on: Aug 17, 2015 * Author: smallcroco * * Discription: * 1 首先打开解压包,可以设置打开方 ...

  2. PHP $_SERVER详解

    $_SERVER['HTTP_ACCEPT_LANGUAGE']//浏览器语言 $_SERVER['REMOTE_ADDR'] //当前用户 IP . $_SERVER['REMOTE_HOST'] ...

  3. 什么情况下会用到try-catch

    本文不区分语言,只为记录一次有收获的面试. 面试官:什么情况下用到try-catch?程序员:代码执行预料不到的情况,我会使用try-catch.面试官:什么是预料不到的情况呢?程序员:比如我要计算a ...

  4. linux下使用远程图形界面

    1. 用xrdp的方式(客户端就是windows下的远程桌面程序) http://jingyan.baidu.com/article/d3b74d64bdab5d1f76e60951.html 2. ...

  5. iOS 多语言的切换

    一.添加应用程序需要支持的国际语言 二.新建一个Localizable.strings文件,作为多语言对应的词典,存储多种语言 三.在Localizable.strings的对应文件以键值对的形式配置 ...

  6. MySql 绿色版配置

    1.下载MySQL http://www.mysql.com/downloads/ 2.配置my.ini # The MySQL server [mysqld] #主目录 basedir = D:/m ...

  7. dev GridView常用属性,事件

    一.属性 1.GridControl属性 //允许拖拽行 gridControl1.AllowDrop = true; 2.GridView属性 //不可编辑 gridView1.OptionsBeh ...

  8. logrotate

    logrotate程序是一个日志文件管理工具.用于分割日志文件,删除旧的日志文件,并创建新的日志文件,起到"转储"作用.可以节省磁盘空间. logrotate命令格式:logrot ...

  9. python导入opencv解决no module named cv2问题

    最近ubuntu用的比较多,在写神经网络代码时也会经常接触到python,但是python的环境配置确实是个头疼的问题. 尤其是接触到opencv时,需要导入opencv的库文件,网上也有很多方法,本 ...

  10. A ship is always safe at the shore - but that is not what it is built for.

    A ship is always safe at the shore - but that is not what it is built for. 船靠岸边总是安全的,但那不是建造它的目的.