用脚本进行DOM操作的代价很昂贵,它是富Web应用中最常见的性能瓶颈。

浏览器中的DOM:天生就慢

  DOM(文档对象模型)是独立于语言的,但在浏览器中的接口是用JavaScript实现的。两个相互独立的功能只要通过接口彼此连接,就会产生消耗。

  访问DOM元素是有代价的,修改元素则更甚。

 function innerHTMLLoop(){
for(var count = 0; count < 15000; count++){
document.getElementById('here').innerHTML += 'a';//糟糕透顶,难道要重复15000次 访问+重写 吗?
}
}

  减少访问DOM的次数,把运算留在ECMAScript这一端处理:

 function innerHTMLLoop(){
var content = '';
for(var count = 0; count < 15000; count++){
content += 'a';
}
document.getElementById('here').innerHTML += content;//一次 访问+重写,比起上面,简直好太多
}

昂贵的集合

  document.getElementsByTagName()

  document.getElementsByClassName()

  document.images

  document.links

  document.forms

  以上方法和属性的返回值为HTML集合对象,类似数组(不是数组,没有push slice等方法),提供了length属性,可以以数字索引访问其中的元素

  重点是,HTML集合对象以一种『假定实时态』实时存在,一直与文档保持着连接,当底层文档对象更新时,它也会更新。这就是低效之源。

  

 var alldivs = document.getElementsByTagName('div');
for(var i = 0; i < alldivs.length; i++){ //length一直在变,一个意外的死循环
document.body.appendChild(document.createElement('div'));
}
  • 将集合拷贝至数组,访问数组较快(但这也会因为额外的步骤多遍历一次集合,评估而定)
  • 缓存length属性
  • 多次访问同一个集合元素时使用局部变量缓存

只取得元素节点

只取得元素节点 不建议使用
children childNodes
childElementcount

childNodes.length

firstElementChild

firstChild

lastElementChild lastChild
nextElementSibling nextSibling
priviousElementSibling priviousSibling

选择器API

  querySelectorAll()

  使用CSS选择器作为参数,返回Nodelist类数组对象,不会返回HTML集合,因此避免了HTML集合引起的性能(和潜在逻辑)问题

 var elements1 = document.getElementById('menu').getElementsByTagName('a');//id为menu的下面的所有<a>
var elements2 = document.querySelectorAll('#menu a');//同上,对比之下,querySeletorAll较简洁 var errs = document.querySelectorAll('div.warning, div.notice');//类为warning和notice的<div>

高性能JavaScript P35-50

DOM编程的性能问题的更多相关文章

  1. 性能优化之数据存储&DOM编程

    多读书多看报 数据存储 ·在javascript中,数据存储的位置会对代码整体性能产生重大的影响. ·数据存储共有4种方式:字面量.变量.数组.对象成员.   ·要理解变量的访问速度,就要理解作用域. ...

  2. JavaScript性能优化 DOM编程

    最近在研读<高性能JavaScript>,在此做些简单记录.示例代码可在此处查看到. 一.DOM 1)DOM和JavaScript 文档对象模型(DOM)是一个独立于语言的,用于操作XML ...

  3. JS性能优化——DOM编程

    浏览器中的DOM  天生就慢 DOM是个与语言无关的API,它在浏览器中的接口却是用JavaScript实现的.客户端脚本编程大多数时候是在个底层文档打交道,DOM就成为现在JavaScript编码中 ...

  4. 读书笔记:JavaScript DOM 编程艺术(第二版)

    读完还是能学到很多的基础知识,这里记录下,方便回顾与及时查阅. 内容也有自己的一些补充. JavaScript DOM 编程艺术(第二版) 1.JavaScript简史 JavaScript由Nets ...

  5. 《高性能javascript》 领悟随笔之-------DOM编程篇(二)

    <高性能javascript> 领悟随笔之-------DOM编程篇二 序:在javaSctipt中,ECMASCRIPT规定了它的语法,BOM实现了页面与浏览器的交互,而DOM则承载着整 ...

  6. 《高性能javascript》 领悟随笔之-------DOM编程篇

    <高性能javascript> 领悟随笔之-------DOM编程篇一 序:在javaSctipt中,ECMASCRIPT规定了它的语法,BOM实现了页面与浏览器的交互,而DOM则承载着整 ...

  7. 高性能JavaScript笔记一(加载和执行、数据访问、DOM编程)

    写在前面 好的书,可能你第一遍并不能领会里面的精魂,当再次细细品评的时候,发现领悟的又是一层新的含义 (这段时间,工作上也不会像从前一样做起来毫不费力,开始有了新的挑战,现在的老大让我既佩服又嫉妒,但 ...

  8. 160826、浏览器渲染页面过程描述,DOM编程技巧以及重排和重绘

    一.浏览器渲染页过程描述   1.浏览器解析html源码,然后创建一个DOM树. 在DOM树中,每一个HTML标签都有一个对应的节点(元素节点),并且每一个文本也都有一个对应的节点(文本节点). DO ...

  9. 浏览器渲染页面过程描述,DOM编程技巧以及重排和重绘。

    一.浏览器渲染页过程描述 1.浏览器解析html源码,然后创建一个DOM树. 在DOM树中,每一个HTML标签都有一个对应的节点(元素节点),并且每一个文本也都有一个对应的节点(文本节点). DOM树 ...

随机推荐

  1. DOS下windows系统查看wifi密码

    DOS下windows系统查看wifi密码 首先,按win+R键,win键如下 弹出框中输入cmd 在弹出界面输入 netsh wlan show profiles 你可以看到你链接过的所有wifi名 ...

  2. 前端编辑工具之VSCode

      因为前段时间看了瞬息之间的一篇文章编辑器背后的程序观, 里面只提到了Visual studio. 我想想可能是因为非.Net开发者,所以不知道Visual sutdio code这个工具.来看看V ...

  3. python学习6

    1.map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回. eg: 2. reduce把一个函数作用在一个序 ...

  4. springMVC异常&&重定向&&转发

    SpringMVC核心技术---转发和重定向 当处理器对请求处理完毕后,向其他资源进行跳转时,有两种跳转方式:请求转发与重定向.而根据要跳转的资源类型,又可分为两类:跳转到页面与跳转到其他处理器.对于 ...

  5. C++ 运算符重载时,将运算符两边对象交换问题.

    在C++进行运算符重载时, 一般来讲,运算符两边的对象的顺序是不能交换的. 比如下面的例子: #include <iostream> using namespace std; class ...

  6. [开源].NET数据库访问框架Chloe.ORM

    扯淡 13年毕业之际,进入第一家公司实习,接触了 EntityFramework,当时就觉得这东西太牛了,访问数据库都可以做得这么轻松.优雅!毕竟那时还年轻,没见过世面.工作之前为了拿个实习机会混个工 ...

  7. [LeetCode] Next Permutation 下一个排列

    Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...

  8. tensorflow学习笔记二:入门基础

    TensorFlow用张量这种数据结构来表示所有的数据.用一阶张量来表示向量,如:v = [1.2, 2.3, 3.5] ,如二阶张量表示矩阵,如:m = [[1, 2, 3], [4, 5, 6], ...

  9. .NET跨平台之旅:在Linux上以本地机器码(native)运行ASP.NET Core站点

    在将“.NET跨平台之旅”示例站点 about.cnblogs.com 从 ASP.NET 5 RC1 升级至 ASP.NET Core 1.0 (博文链接)之后,我们有一个难以抗拒的冲动 —— 体验 ...

  10. NIO服务器

    导语 NIO的出现是为服务器端编程而设计的.它的作用就是能够让一个线程为多个连接服务.NIO中的API都是非阻塞模式的,这样可以在服务器端采用异步的方式来处理多个请求.NIO中有两个重要的东西就是通道 ...