DOM编程的性能问题
用脚本进行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编程的性能问题的更多相关文章
- 性能优化之数据存储&DOM编程
多读书多看报 数据存储 ·在javascript中,数据存储的位置会对代码整体性能产生重大的影响. ·数据存储共有4种方式:字面量.变量.数组.对象成员. ·要理解变量的访问速度,就要理解作用域. ...
- JavaScript性能优化 DOM编程
最近在研读<高性能JavaScript>,在此做些简单记录.示例代码可在此处查看到. 一.DOM 1)DOM和JavaScript 文档对象模型(DOM)是一个独立于语言的,用于操作XML ...
- JS性能优化——DOM编程
浏览器中的DOM 天生就慢 DOM是个与语言无关的API,它在浏览器中的接口却是用JavaScript实现的.客户端脚本编程大多数时候是在个底层文档打交道,DOM就成为现在JavaScript编码中 ...
- 读书笔记:JavaScript DOM 编程艺术(第二版)
读完还是能学到很多的基础知识,这里记录下,方便回顾与及时查阅. 内容也有自己的一些补充. JavaScript DOM 编程艺术(第二版) 1.JavaScript简史 JavaScript由Nets ...
- 《高性能javascript》 领悟随笔之-------DOM编程篇(二)
<高性能javascript> 领悟随笔之-------DOM编程篇二 序:在javaSctipt中,ECMASCRIPT规定了它的语法,BOM实现了页面与浏览器的交互,而DOM则承载着整 ...
- 《高性能javascript》 领悟随笔之-------DOM编程篇
<高性能javascript> 领悟随笔之-------DOM编程篇一 序:在javaSctipt中,ECMASCRIPT规定了它的语法,BOM实现了页面与浏览器的交互,而DOM则承载着整 ...
- 高性能JavaScript笔记一(加载和执行、数据访问、DOM编程)
写在前面 好的书,可能你第一遍并不能领会里面的精魂,当再次细细品评的时候,发现领悟的又是一层新的含义 (这段时间,工作上也不会像从前一样做起来毫不费力,开始有了新的挑战,现在的老大让我既佩服又嫉妒,但 ...
- 160826、浏览器渲染页面过程描述,DOM编程技巧以及重排和重绘
一.浏览器渲染页过程描述 1.浏览器解析html源码,然后创建一个DOM树. 在DOM树中,每一个HTML标签都有一个对应的节点(元素节点),并且每一个文本也都有一个对应的节点(文本节点). DO ...
- 浏览器渲染页面过程描述,DOM编程技巧以及重排和重绘。
一.浏览器渲染页过程描述 1.浏览器解析html源码,然后创建一个DOM树. 在DOM树中,每一个HTML标签都有一个对应的节点(元素节点),并且每一个文本也都有一个对应的节点(文本节点). DOM树 ...
随机推荐
- android 自定义通知栏
package com.example.mvp; import cn.ljuns.temperature.view.TemperatureView;import presenter.ILoginPre ...
- Linux命令随笔
Linux命令总结 man ==命令帮助; help ==命令的帮助(bash的内置命令); ls ==list,查看目录列表; -ld:查看目录权限; -l:(long)长格式显示属性; -F:给不 ...
- 关闭selinux
1.查看SELinux状态:getenforce Enforcing(启动) disable(禁用) 1.禁用SELinux(重启后依然生效) 修改 vi /etc/sysconfig/selinux ...
- Jmeter添加硬件监控
首先非常感谢介绍jmeter的博主,多谢您. 看了之后受益匪浅啊~~ 根据这篇博文的说法,首先进入网站 点击Jmeter-plugins.org 点击downloads 这两个都可以下载,反正都一样. ...
- Programming Learning - Based on Project
Today when taking a bath I got a good idea that it is an efficient and interesting way to learn a ne ...
- fopen函数和fread函数、fwrite函数
fopen(打开文件) 相关函数 open,fclose 表头文件 #include<stdio.h> 定义函数 FILE * fopen(const char * path,const ...
- Java中接口和抽象类的区别
经常看到这样的问题,就是问这两个的区别,我这也总结一下: 1,宏观上说,一个是类,一个是接口,类只支持单一继承,接口支持多个继承 2,微观上说,就是从内部来说 a,成员变量方面 接口可以包含方法,属性 ...
- [LeetCode] 132 Pattern 132模式
Given a sequence of n integers a1, a2, ..., an, a 132 pattern is a subsequence ai, aj, ak such that ...
- [LeetCode] Jump Game II 跳跃游戏之二
Given an array of non-negative integers, you are initially positioned at the first index of the arra ...
- jquery点滴
1.toggle 2.next prev after before 3.on 4.当我们使用jquery的attr('checked',true)或者attr('checked','checked') ...