[读书笔记]高性能js-DOM优化

我们都知道,在js编程中,很大一部分是和DOM打交道。

DOM是和编程语言无关的一个东西,用来映射html文档的,DOM里面包含一些API。在浏览器中,这些API可以被js调用。但是DOM和ECMA又是不同的2个模块,它们之间的沟通需要跨模块。所以,访问DOM就会比较慢。天生的 。。。

慢就慢把,总能做一些优化吧。

 DOM访问和修改。

都说访问DOM耗性能,用循环访问更是如此。所以可以减少DOM访问来优化。

比如

for(var i=0;i<1000;i++){

document.getElementById(‘a‘).innerHTML+=‘a‘;

}

这段代码每次循环都访问了2次DOM,读取innerHTML一次,重写innerHTML里面的内容一次。超级耗性能啊。

改成

var  str=‘‘;

for(var i=0;i<1000;i++){

str+=‘a‘;

}

document.getElementById(‘a‘).innerHTML=str;

for循环的部分不涉及DOM访问,在最后的时候访问一次DOM,重写DOM,ok。

(以上是针对一个DOM元素的,下面要讲一堆DOM元素,也就是HTML集合,原理也一样,就是弄成局部变量)

html集合

用document.getElementsByTagName之类的dom方法获得的都是类数组。只有length属性和可以通过下标查询元素。没有原生数组的一些方法。

另外由于html集合是和html文档随时绑定的。所以每次需要html集合里面的内容,哪怕是length,都会重复查询html文档。这就造成了低效。。

1.缓存length属性,免得每次查询都要遍历HTML文档来获得length。(在没有增删节点的情况下)。

2 利用局部变量访问html集合:

var a=document.getElementByName(‘a‘);

var str=‘‘;

for(var i=0;i<1000;i++){

  str+=document.getElementByName(‘a‘)[i];

}

改成

var a=document.getElementByName(‘a‘);

var str=‘‘;

for(var i=0;i<1000;i++){

  str+=a[i];

}

3 元素节点的获取

一般用childnodes,但这个效率低,还或获得文字节点,这些我们一般用不到,还要写代码删去。麻烦。。。

建议用children属性,直接获得nodelist的元素节点,效率也高。IE6都支持啊。。

另外一些好的节点获取方法,支持性不是很好,就不写了。嘿嘿。

4选择器API

超好用的选择器api,document.querySelectorAll(‘#a .a‘);

获得的是non-live的nodelist,也就是不是时时链接html文档的。不用担心访问DOM的性能啦。并且这个API比传统的一些获取DOM集合的方法速度快,还有代码短啊,就一句。棒!檫,别忘了做兼容,这个IE8以下不行。。。

重排和重绘

页面下载完所有的文件之后,(包括html,css,js,img等等),开始绘制2棵树了。一棵是DOM树,另一棵是渲染树。

DOM树就是把html的文档结构映射到一棵树上。(好像是废话)。。。

渲染树用来表示dom怎么在浏览器中显示。

所有的DOM节点都在渲染树中有自己的位置(除了隐藏的节点外)。渲染树中的节点可以看成是一个box。

当这2棵树弄好了之后,浏览器就开始绘制啦(painting过程)

但绘制过程并非这么顺利。有时候突然改变了元素的box,比如宽度啊高度啊,这就影响了另外的DOM元素,浏览器就会找出受影响的部分,重新构造渲染树,这个过程就叫重排(reflow回流)。重排完成后,就会进行重绘(repaint)的过程了。

重排会发生在很多情况,比如宽高的改变(渲染树重构),增加元素(DOM树和渲染树都重构了),增加滚动条(整个页面都被重排了)。

所以我们要尽可能减少重排和重绘

有什么方法呢?

时间: 2024-08-08 02:49:02

[读书笔记]高性能js-DOM优化的相关文章

高性能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

js DOM优化相关探索

我在这尝试两个方面:-->DOM与js -->DOM与浏览器 (最近在秒味视频上学到不少,哈哈哈) 一.DOM与js 1.js与dom的交互问题 频繁的与dom交互,是一件浪费时间与金钱的事情,这就需要我们尽量改进自己的代码,让我们想做的事情尽量在js中做的差不多了在去跟dom打交道. 下面的小例子就说明了问题: 1 <!DOCTYPE html> 2 <html lang="zh"> 3 <head> 4 <meta charse

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

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

读书笔记-你不知道的JS上-对象

好想要对象··· 函数的调用位置不同会造成this绑定对象不同.但是对象到底是什么,为什么要绑定他们呢?(可以可以,我也不太懂) 语法 对象声明有两个形式: 1.字面量 => var obj = { ... }; 2.构造形式 => var obj = new Object(); 两种形式生成的对象是一样的,唯一的区别是,在文字声明中可以添加多个键值对,构造形式只能逐个添加. 类型 JS中有六种主要类型:string.number.booleam.null.undefined.object.

[读书笔记]高性能JS-加载执行

for web browser have only one thread.while loading or execute js, the UI update will be blocked.some way to improve 1.put js before </body> tag.so js will be loaded and run after page have been fully loaded. 2.orangize script.combine some script to

[读书笔记]高性能JS-编程实践

This part is some example to practice. 1 avoid double evaluation less use of eval,new Function,settimeout,setinterval. string in these method are executable js code.when use these method,js will execute code twice ,first is normal js,second is js cod

[读书笔记]高性能js-界面快速响应

浏览器有个UI线程,包括UI更新和JS的执行.和UI线程相关的是队列系统. <button onclick='alert(1)'>123</button> 比如我们点击这个按钮,UI线程会添加2个任务到队列中,一个是更新UI的外观,一个是执行JS代码. 如图片 其实在js执行的过程中也可能会向队列系统中添加任务,就比如上面在js执行的过程中就想队列中添加了更新UI的任务,在UI线程执行完了js代码之后,就接着执行UI的更新. 一般情况下,js代码执行事件要在100毫秒以内,这样用户

读书笔记-高性能网站建设指南(2007)

人的思维往往会进入一种误区,认为"后面的","背后的"东西都是神秘的,伟大的影响力非凡的.所以很多书以"某某内幕"为题,很多程序猿以精通"底层开发"或"后端开发"为荣:同样的当网站出现问题时,我们第一时间想到的也是如何优化"后端".但这并不一定就是正确的,也许从前端入手,改善性能,将事半功倍. 绪言A:前端性能的重要性 在请求脚本时不会发生并行请求.这是因为在多数情况下,浏览器在下载脚本

【读书笔记】iOS网络-优化请求性能

一,度量网络性能 1,网络带宽 用于描述无线网络性能的最常见度量指标就是带宽.在数字无线通信中,网络带宽可以描述为两个端点之间的通信通道每秒钟可以传输的位数.现代无线网络所能提供的理论带宽是很高的.不过请记住,运营商与网络设备提供商引用的带宽数字常常是该项技术的理论最大值,网络设备使用的实际带宽可能与这个最大值之间存在很大的偏差. 2,网络延迟. 度量网络性能的第2个因素是网络延迟,指的是网络包在两个端点间一次往返所需的时间.无线运营商很少会提到网络的延迟数据,不过延迟却会对应用的实际性能造成很