一些JavaScript中的DOM的优化小技巧

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

一、对象集合 NodeList

当我们调用:getElementsByTagName,getElementsByName,getElementsByClassName的时候,返回的结果是一个NodeList,这个NodeList是实时的。如果你修改对应的html,那么NodeList中也会得到修改。

而且,NodeList的length属性是指访问NodeList的那一刻,其中包含的节点数量。

所以当下面这个代码运行时有可能会导致死循环(这里先不讨论在一个循环里多次调用appendChild方法):

1 var divList = document.getElementsByTagName("div");
2 for( var i = 0; i < divList.length ; i++ ){
3     var d = document.createElement("div");
4     document.body.appendChild(d);
5     console.log(i);
6 }

因为当i增加的时候,divList.length也一直在以相同的速度增加,所以当文档中原本的<div>的数量 大于等于 1时,i永远不可能等于divList.length。运行代码的时候,你的页面甚至有可能会显示不出这些div,但是你可以通过控制台打印i的值观察其执行的次数。

所以,永远不要写这样的代码,但是你可以像下面这样子写:

1 var divList = document.getElementsByTagName("div");
2 for( var i = 0, len = divList.length ; i < len ; i++ ){
3     var d = document.createElement("div");
4     document.body.appendChild(d);
5     console.log(i);
6 }

我们还可以通过一些方法将NodeList转换成普通数组,然后在对其进行操作:

var arrayOfNodes = Array.prototype.slice.call(divList,0);

但是这个方法在IE8及IE之前的版本无效,因为IE8之前将NodeList实现为COM对象,如果真的需要大量用到这个NodeList,并且在IE8和IE之前版本中,那么只好遍历了。

二、对DOM进行一些样式的修改

当修改元素的CSS属性时,如果涉及到很多CSS属性,那么不妨考虑增加一个CSS class,然后通过改变元素节点的class来实现这个目的。

修改前:

1 element.style.cssText += "width:200px;height:200px;background-color:red;border:1px solid white";

修改后:

在css文件中增加一个样式:

1 .active{
2     width:200px;
3     height:200px;
4     background-color:red;
5     border:1px solid white;
6 }

在JS中这样写:

1 element.className += " active"

三、节点增加、移除

比如在一个文档中有一些比较复杂的DOM树需要进行大量的渲染操作,那我们可以先设置其隐藏,让其脱离文档流,等到相应的改变做完之后,再将其显示,使其加入到文档流中。这样做的好处是不会在页面上出现“运行一点,渲染一点”的情况,而是“先运行全部”,“再渲染全部”,从而提高了效率。

最后对于上面曾提到的:多次调用appendChild方法导致的多次重排,重绘。可以通过:document.createDocumentFragment()解决这个问题:

1 var divList = document.getElementsByTagName("div"),
2     tempFragment = document.createDocumentFragment();
3 for( var i = 0; i < 100 ; i++ ){
4     var d = document.createElement("div");
5     d.className += " active"
6     tempFragment.appendChild(d);
7 }
8 document.body.appendChild(tempFragment);

来自为知笔记(Wiz)

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

一些JavaScript中的DOM的优化小技巧

时间: 2024-10-12 00:02:37

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

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

javascript中10常用的个小技巧总结 本文转自:http://www.cnblogs.com/libin-1/p/6756393.html 1. new Set() 可能有人知道ES6中提供了新的数据结构 Set,但是能够灵活运用的人或许不多.利用Set数据结构我们能够轻松的去重一个数组,比如: let arr = [1, 2, 2, 3]; let set = new Set(arr); let newArr = Array.from(set); // Array.from方法可以将

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

如果你还是新手, 而且读完所有这些技巧的详解和每种技巧是如果工作的以后运用它们, 你会写出更加简练高效的JavaScript程序. 确实, JavaScript高手已经运用这些技巧写出了很多强大, 高效的JavaScript程序. 但是你可以这样. 强大的 && 和 || 表达式你可能在JavaScript库和JavaScript框架中已经见过它们了, 那么我们先由几个基本的例子开始: 例子1. || (或)设置默认值, 通常用 代码如下: 1 function documentTitle

javascript中的dom元素操作

javascript中的Dom事件操作 函数 函数就是将一些方法封装,通过调用执行函数. 作用: 避免重复代码. 简化编程,让编程模块化. 语法:fuction(){ } function是一个关键字,类似于Python中定义函数的"def": 小括号里放参数 大括号里放函数语句. 函数的调用 函数名+() 函数的参数 形参 实参 argument:只能在函数中使用. 返回实参的个数:argument.length 返回形参的个数:fn.length 伪数组 可以修改元素,但不能改变数

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

javascript中获取dom元素高度和宽度的方法如下: 网页可见区域宽: document.body.clientWidth网页可见区域高: document.body.clientHeight网页可见区域宽: document.body.offsetWidth (包括边线的宽)网页可见区域高: document.body.offsetHeight (包括边线的高)网页正文全文宽: document.body.scrollWidth网页正文全文高: document.body.scrollH

asp.net的优化小技巧收集

在页面不需要交互的情况下可以禁用ViewState 1.页面整体禁用ViewState:在顶部<%Page>中EnableViewState="false"; 2.指定控件禁用ViewState:控件的EnableViewState属性设置为false; 完全不要ViewState则把页面中的form中的runat="server"去掉(极端,后果很严重,Button等一大部分服务端控件不能用)这种情况一般用在站内搜索功能的时候,因为没去掉的时候,地址栏

做OI题时的一些常用的常数优化小技巧

注意:本文所介绍的优化并不是算法上的优化,那个就非常复杂了,不同题目有不同的优化.笔者要说的只是一些实用的常数优化小技巧,很简单,虽然效果可能不那么明显,但在对时间复杂度要求十分苛刻的时候,这些小的优化对于帮助你成功卡常也是十分重要的.那么我们让切入正题吧. (1)inline放在自定义函数前 不要问为什么,加就行了!额,这个东西好像可以让你的函数有机会被计算机执行得稍微快一点,一般放在使用次数比较多的函数前,像check(),为sort()定制的CMP()等等,当然主函数前就不要放了...比如

125个提高网页可用性的优化小技巧(二)

125个提高网页可用性的优化小技巧(二) --安阳师范学院互联网+应用技术学院UI设计方向讲师 崔凯让常用功能和重要数据信息更接近用户预测用户的意图,让他们尽可能接近目标. △ 筛选出或跳至用户正在搜索的条目 △ 将用户常选项目列为默认选项△ 产品列表页上把重要数据信息展示出来很多时候用户需要像踩弹簧高跷杖一样,点击一个产品,查看信息,返回上一页,再反复操作以查看其他产品.这种设计的可用性差.应把重要信息直接放在主要页面,减少用户反复操作的次数.如果你怕这样页面会杂乱,也可以设计成鼠标悬停时显示

How Javascript works (Javascript工作原理) (十一) 渲染引擎及性能优化小技巧

个人总结:读完这篇文章需要20分钟,这篇文章主要讲解了浏览器中引擎的渲染机制. DOMtree       ----|   |---->  RenderTree CSSOMtree  ----| 这是 JavaScript 工作原理的第十一章. 迄今为止,之前的 JavaScript 工作原理系列文章集中于关注 JavaScript 语言本身的功能,在浏览器中的执行情况,如何优化等等. 然而,当在构建网络应用的时候,不仅仅只是编写自己运行的 JavaScript 代码.所编写的 JavaScri

JavaEE笔记——JavaScript中对dom的操作

节点及其类型 在JavaScript中,节点分为三种: 元素节点:HTML标签元素. 属性节点: 元素的属性, 可以直接通过属性的方式来操作. 文本节点: 是元素节点的子节点, 其内容为文本. 在 html 文档的什么位置编写 js 代码? 一般地, 在 body 节点之前编写 js 代码, 但需要利用 window.onload 事件, 该事件在当前文档完全加载之后被触发, 所以其中的代码可以获取到当前文档的任何节点 <head> <meta http-equiv="Cont