DOM访问---高性能JavaScript读书笔记(3)

在JavaScript高级程序设计第一章当中就把JavaScript分成三大部分

所以事实上DOM和BOM是两在独立的部分,它们之间的通信是通过相互之间的功能接口来实现的,这样说来两个独立的部分以功能接口必定会带来性能损耗。这也就是为什么大家一致都说尽量少去访问和修改DOM元素(注意我这里说的是访问和修改,为什么包括访问,请继续往下看  哈哈)。

下面用一张图来说明它们各自的作用。

1、在修改DOM元素的时候,我们应该尽量使用innerHTML而不是CreateElement再AppendChild(因为经过测试,在所有的浏览器当中使用innerHTML更加快一些)

2、修改DOM元素内容时另外一个方法是使用element.cloneNode来代替document.createElement()

3、在循环或者遍历元素时,尽量使用局部变量保存HTML Collections

那具体什么叫HTML Collections,它包括哪些元素呢?

总结一句话就是说HTML Collections事实上是虚拟存在的,意味着当底层文档更新时,它们将自动更新。当每次迭代访问HTML Collections的length属性时,它会导致集合器更新,所以将length属性缓存到一个变量中,然后在循环判断条件中使用这个变量。

4、childNodes是一个集合,这也是为什么很多提高JavaScript性能的建议当中有这样一条了“使用firstChild和nextSibling代替childNodes遍历dom元素”  用图来说话吧(不信你可以测试一下,明显testNextSibling的速度比testChildNodes的快特别是当数据量大的时候一眼就能看出来)

5、如果浏览器使用具有原生的QuerySelectorAll()方法和querySelector()方法尽量使用它们(因为自己实现它们的功能需要编写特别多的代码,还有就是任何编程语言都有一个共通的特性就是原生方法永远是性能最佳的)

6、最小化重绘和重排

在说明这个的时候顺便理清一下什么叫重绘,什么叫重排

大家都知道当一个页面展示在我们面前的时候,事实上浏览器下载完成所有的html标记,js,css,图片之后,它解析文件并创建两个内部结构,一个是DOM树,一个是渲染树。浏览器根据DOM树来进行排列,根据渲染树来进行绘制。

什么情况下会发什么重排呢

  • 添加或删除可见的DOM元素
  • 元素位置改变
  • 元素尺寸改变(因为边距、填充、边框宽高等属性)
  • 内容改变
  • 最初的页面渲染
  • 浏览器窗口改变尺寸

理解了重排,重绘就更加简单了,从字面意思上来说就是重新绘制,那什么情况下会发生重绘,比如说改变样式背景等

上图中列举的这些属性的访问将会导致重新刷新渲染树从而导致重排,最好减少对这些属性(布局信息)的查询次数,查询时将它赋给局部变量,并用局部变量参与计算。

再来看一个小例子

这明显是糟糕的代码,改变了三次风格属性,导致浏览器重排了三次。一个提高效率的方法就是只重排一次。看下面代码就明白了

或者使用类名的方法

当你需要对DOM树中的多个元素进行修改的话,最好依据下列步骤来减少重排和重绘

  • 从文档流中摘下此元素
  • 对其应用多重改变
  • 将元素带回文档中

有三种方式可以将元素从文档流中摘除

  • 隐藏元素,对其进行修改后再显示
  • 使用文档片断在已存DOM之外创建一个子树,然后将它拷贝到文档中(推荐使用此方法,因为它是涉及最小数量的DOM操作和重排)
  • 将原始元素拷贝到一个脱离文档的节点中,修改副本,然后副本,然后覆盖原始元素

将第二次方案的代码贴一下,希望大家能使用这种方法来提高性能。

       for (var i = 0; i < 1000; i++) {
            var el = document.createElement(‘p‘);
            el.innerHTML = i;
            document.body.appendChild(el);
        }
        //可以替换为:
        var frag = document.createDocumentFragment();
        for (var i = 0; i < 1000; i++) {
            var el = document.createElement(‘p‘);
            el.innerHTML = i;
            frag.appendChild(el);
        }
        document.body.appendChild(frag);

如果是动画元素的话,最好使用绝对定位以让它不在文档流中,这样的话改变它的位置不会引起页面其它元素重排

(我要说的就这些啦,希望大家共同探讨!)

时间: 2024-08-06 11:56:32

DOM访问---高性能JavaScript读书笔记(3)的相关文章

数据访问---高性能JavaScript读书笔记(2)

对于任何一种编程语言来说,数据存储的位置关系到访问速度! 在JavaScript中的直接量包括字符串string.数字number.布尔值boolean.对象object.数组array.函数function.正则表达式regular expression.空值null.未定义数组undefined.而数组项则需要通过数组的数字索引来访问,对象通过字符串进行索引来访问其成员(这里顺便提一句因为数组项是通过数字进行索引.对象成员是通过字符串进行索引,所以这也就是为什么访问对象成员比访问数组项更慢的

高性能javascript读书笔记(三.DOM 编程1)

第三章DOM Script DOM编程 读书笔记 访问和修改DOM元素 浏览器通常要求DOM实现和JavaScript保持相互独立. <!-- 例如IE中,被称为JScript的JavaScript实现位于库文件jscript.dll中,而DOM实现位于另一个库mshtml.dll(内 部代号Trident).这种分离技术允许其他技术和语言,如VBScript,受益于Trident所提供的DOM功能和渲染功能.Safari使用Webkit的WebCore处理DOM和渲染,具有一个分离的JavaS

加载和运行---高性能JavaScript读书笔记(1)

众所周知大多数浏览器是使用单进程处理UI更新和JavaScript运行等多个任务的,而同一时间只能有一个任务被执行,如此说来,JavaScript运行了多长时间就意味着用户得等待浏览器响应需要花多久时间. 从认知上来说,解析器解析一个界面的时候都是从上至下依次解析的,这就是说界面上出现多少个<script>标签(不管是内联还是外部文件),页面下载和解析必须停止等待脚本下载完成并运行完成(注意这里包括运行),这个过程当中,页面解析和用户交互是被完全阻塞的. Javascript第一条定律:将脚本

高性能javascript读书笔记(三.DOM 编程2)

重绘和重排版 浏览器下载完所有的HTML标记,Javascript,CSS,图片之后,它解析文件并创建两个内部数据结构 DOM树 表示页面结构渲染树 表示DOM节点如何显示 渲染树中为每个需要显示的DOM树木=节点存放至少一个节点(隐藏DOM元素在选桉树中没有对应节点)渲染树上的节点称为"框"或者"盒",符合CSS模型的定义,将页面元素看作一个具有填充,边距,边框和位置的盒.一 旦DOM树和渲染树构造完毕,浏览器就可以显示(绘制)页面上的元素了. 当DOM改变影响到

Javascript读书笔记:函数定义和函数调用

定义函数 使用function关键字来定义函数,分为两种形式: 声明式函数定义: function add(m,n) { alert(m+n); } 这种方式等同于构造一个Function类的实例的方式: var add = new Function("m", "n", "alert(m+n);"); Function类构造方法的最后一个参数为函数体:"alert(m+n);",前面的都是函数的形参,参数必须是字符串形式的:&

Javascript读书笔记:字符串常用方法

concat() 连接多个字符串,返回合并后的字符串. 1 var s1="a"; 2 var s2="b"; 3 var s3="c"; 4 5 console.log(s1.concat(s2,s3));//abc 数组中的concat():将参数添加为数组的元素,返回新的数组. 1 var arr = [1, 2, 3]; 2 console.log(arr.concat(4, 5));//[1,2,3,4,5] indexOf() 查找子

高性能javascript学习笔记系列(1) -js的加载和执行

这篇笔记的内容主要涉及js的脚本位置,如何加载js脚本和脚本文件执行的问题,按照自己的理解结合高性能JavaScript整理出来的 javascript是解释性代码,解释性代码需要经历转化成计算机指令的过程,这个过程就会带来一定的性能损耗,所以在js中做性能的优化是必须的 javascript的阻塞特性:浏览器在执行js代码的时候,不能做其他的任何事情,因为浏览器使用单一的进程来处理用户界面的刷新和javascript的脚本执行,也就是说什么时候执行js脚本影响着用户对页面的使用体验(之所以js

读《高性能javascript》笔记(一)

第一章加载与执行:1,js脚本会阻塞页面渲染,<script>尽可能放到<body>标签的底部2, 合并脚本,页面中的<script>标签越少:HTTP请求带来的额外开销方面,减少页面外链脚本文件的数量将会改善性能3,css文件是并行下载,不会阻塞页面的其他进程 无阻塞脚本:1,延迟脚本:使用<script>的defer属性(仅适用于IE4+和Firefox3.5以上版本)2,动态创建<script>来下载并执行代码3,适用XHR对象下载js代码

高性能javascript学习笔记系列(6) -ajax

参考 高性能javascript javascript高级程序设计 ajax基础  ajax技术的核心是XMLHttpRequest对象(XHR),通过XHR我们就可以实现无需刷新页面就能从服务器端读取数据 var xhr = new XMLHttpRequest(); //只支持IE7以及更高的版本 xhr.onreadystatechange = function() { if(xhr.readyState == 4) { if( (xhr.status >= 200 && xh