`
天梯梦
  • 浏览: 13754338 次
  • 性别: Icon_minigender_2
  • 来自: 洛杉矶
社区版块
存档分类
最新评论

高性能JavaScript DOM编程

 
阅读更多

我们知道,DOM是用于操作XML和HTML文档的应用程序接口,用脚本进行DOM操作的代价很昂贵。有个贴切的比喻,把DOM和 JavaScript(这里指ECMScript)各自想象为一个岛屿,它们之间用收费桥梁连接,ECMAScript每次访问DOM,都要途径这座桥, 并交纳“过桥费”,访问DOM的次数越多,费用也就越高。因此,推荐的做法是尽量减少过桥的次数,努力待在ECMAScript岛上。我们不可能不用 DOM的接口,那么,怎样才能提高程序的效率?

 

1、DOM访问与修改


访问DOM元素是有代价的(“过桥费”你懂的),修改元素代价更是昂贵,因为它会导致浏览器重新计算页面的几何变化(重排和重绘)。

当然最坏的情况是在循环中访问或者修改元素,看下面两段代码:

var times = 15000;

// code1
console.time(1);
for(var i = 0; i < times; i++) {
  document.getElementById('myDiv1').innerHTML += 'a';
}
console.timeEnd(1);

// code2
console.time(2);
var str = '';
for(var i = 0; i < times; i++) {
  str += 'a';
}
document.getElementById('myDiv2').innerHTML = str;
console.timeEnd(2);

 

结果第一次运行的时间居然是第二次的千倍!(chrome 版本 44.0.2403.130 m)

1: 2846.700ms
2: 1.046ms

 

第一段代码的问题在于,每次循环迭代,该元素都会被访问两次:一次读取innerHTML的值,另一次重写它,也就是说,每次循环都在过桥(重排和重绘将在下一篇讲解)!结果充分表明,访问DOM的次数越多,代码的运行速度越慢。因此,能减少DOM访问的次数则尽量减少,尽量留在ECMAScript这端处理。

 

2、HTML集合 & 遍历DOM


操作DOM另一个耗能点就是遍历DOM,一般我们会收集一个HTML集合,比如用getElementsByTagName(),或者用document.links等,我想大家对此都不陌生。收集的结果是一个类似数组的集合,它处于一种“实时状态”实时存在,这意味着当底层文档对象更新时,它也会自动更新。怎么讲?很简单举个栗子:

<body>
  <ul id='fruit'>
    <li> apple </li>
    <li> orange </li>
    <li> banana </li>
  </ul>
</body>
<script type="text/javascript">
  var lis = document.getElementsByTagName('li');
  var peach = document.createElement('li');
  peach.innerHTML = 'peach';
  document.getElementById('fruit').appendChild(peach);

  console.log(lis.length);  // 4
</script>

 

而这正是低效之源!很简单,跟数组的优化操作一样,缓存个length变量就ok了(读取一个集合的length比读取一个普通数组的lengh要慢很多,因为每次都要查询):

console.time(0);
var lis0 = document.getElementsByTagName('li');
var str0 = '';
for(var i = 0; i < lis0.length; i++) {
  str0 += lis0[i].innerHTML;
}
console.timeEnd(0);

console.time(1);
var lis1 = document.getElementsByTagName('li');
var str1 = '';
for(var i = 0, len = lis1.length; i < len; i++) {
  str1 += lis1[i].innerHTML;
}
console.timeEnd(1);

 

我们看看性能提升能有多少?

0: 0.974ms
1: 0.664ms

 

当集合的长度大的时候(demo是1000),性能提升还是很明显的。

而《高性能JavaScript》提出了另一个优化策略,它指出,“由于遍历数组比遍历集合快,因此如果先将集合元素拷贝到数组中,那么访问它的属性会更快”,经过测试,并没有很好地发现这个规律,所以还是不要多此一举了,测试代码如下:(有疑义欢迎与我交流探讨)

console.time(1);
var lis1 = document.getElementsByTagName('li');
var str1 = '';
for(var i = 0, len = lis1.length; i < len; i++) {
  str1 += lis1[i].innerHTML;
}
console.timeEnd(1);

console.time(2);
var lis2 = document.getElementsByTagName('li');
var a = [];
for(var i = 0, len = lis2.length; i < len; i++)
  a[i] = lis2[i];

var str2 = '';
for(var i = 0, len = a.length; i < len; i++) {
  str2 += a[i].innerHTML;
}
console.timeEnd(2);

 

本节的最后介绍两个原生DOM方法,querySelector()querySelectorAll(),相信大家都不陌生,前者返回一个数组(注意,它们的返回值不像HTML集合一样会动态变化),后者返回匹配的第一个元素。好吧,其实并不是所有时候它的性能都优于前者的HTML集合遍历。

console.time(1);
var lis1 = document.getElementsByTagName('li');
console.timeEnd(1);

console.time(2);
var lis2 = document.querySelectorAll('li');
console.timeEnd(2);

// 1: 0.038ms
// 2: 3.957ms

 

但是因为它是类似CSS的选择方法,所以在做组合选择的时候,效率会提升,又方便。比如做如下的组合查询:

var elements = document.querySelectorAll('#menu a');
var elements = document.querySelectorAll('div.warning, div.notice');

 

 

原文:http://www.cnblogs.com/zichi/p/4713031.html

转自:高性能JavaScript DOM编程

 

 

 

 

 

分享到:
评论

相关推荐

    JavaScript DOM编程艺术【第2版&高清】.pdf

    但是,根据标题《JavaScript DOM编程艺术【第2版&高清】.pdf》和描述“JavaScript DOM编程艺术,高清资源,无比经典,值得拥有”,我们可以推断这本书主要讲述了JavaScript中DOM(文档对象模型)的相关编程技术。...

    经典之作javascript dom编程艺术源码

    通过学习并实践《JavaScript DOM编程艺术》中的源码,开发者能够掌握原生JavaScript对DOM的精细控制,从而提升网页交互的灵活性和性能。同时,理解并熟练运用这些知识点,对于开发高效、响应式的Web应用至关重要。在...

    javascriptDom编程艺术+源码

    《JavaScript DOM编程艺术》是一本深受开发者欢迎的JavaScript学习书籍,专注于DOM(Document Object Model)这一核心概念。DOM是Web页面的结构模型,通过JavaScript与DOM的交互,开发者可以实现对网页内容的动态...

    JavaScript DOM编程艺术 第2版

    ### JavaScript DOM编程艺术 第2版 #### 知识点概览 从提供的信息来看,《JavaScript DOM编程艺术 第2版》是一本专注于JavaScript及其与DOM(文档对象模型)交互的书籍。DOM是网页的核心组成部分之一,它定义了...

    JavaScript DOM编程艺术(第2版).pdf

    《JavaScript DOM编程艺术(第2版)》是深入学习JavaScript与DOM操作的重要参考资料,它涵盖了JavaScript语言的基础以及在网页开发中如何有效地利用DOM进行动态交互的高级技术。这本书旨在帮助开发者提升JavaScript...

    javascript dom编程艺术 第2版 源码

    《JavaScript DOM编程艺术 第2版》是一本深入探讨JavaScript与DOM(Document Object Model)交互的权威书籍。DOM是Web页面的结构化表示,通过JavaScript,我们可以利用DOM来动态地操作HTML和XML文档,实现丰富的交互...

    Javascript DOM编程艺术(中文版)

    ### JavaScript DOM编程艺术知识点概述 #### 一、DOM基础概念 **1.1 DOM简介** DOM(Document Object Model)即文档对象模型,是一种与平台和语言无关的接口,它允许程序和脚本动态地访问和更新文档的内容、结构和...

    JAvascript Dom编程艺术 图片库

    JavaScript DOM编程艺术是一本专为前端开发者准备的基础教程,它深入浅出地讲解了如何使用JavaScript操作DOM(Document Object Model)来实现动态网页效果。DOM是HTML和XML文档的结构化表示,允许程序和脚本动态更新...

    高性能JavaScript DOM编程(1)

    总结以上,要实现高性能的JavaScript DOM编程,关键在于减少不必要的DOM操作,尤其是减少访问和修改DOM的次数。通过在JavaScript中预先处理数据和优化循环结构,可以大幅提高代码的执行效率。此外,对HTML集合进行...

    JavaScript DOM编程艺术第二版(英文).pdf

    1. JavaScript基础:JavaScript作为一门编程语言,它的基本语法、数据类型、函数、对象等基础知识是学习DOM编程的前提。这本书可能会从这些基础概念讲起,逐步引导读者了解JavaScript的高级特性。 2. HTML和CSS知识...

    高性能JavaScript 编程pdf电子书(中英文对译)

    《高性能JavaScript》揭示的技术和策略能帮助你在开发过程中消除性能瓶颈。你将会了解如何提升各方面的性能,包括代码的加载、运行、DOM交互、页面生存周期等。雅虎的前端工程师Nicholas C. Zakas和其他五位...

    JavaScript Dom编程艺术

    ### JavaScript DOM编程艺术 #### 一、概述 《JavaScript DOM编程艺术》是一本关于Web设计与JavaScript及文档对象模型(Document Object Model,简称DOM)相结合的专业书籍。本书由Jeremy Keith编写,通过深入浅出...

    《高性能JavaScript编程》.Nicholas.C.Zakas著.英文版

    《高性能JavaScript编程》是著名前端开发者Nicholas C. Zakas所著的一本经典书籍,英文原版名为"High Performance JavaScript"。这本书深入探讨了如何优化JavaScript代码,提升Web应用程序的性能,是JavaScript...

    JavaScript DOM编程艺术

    9. **现代JavaScript与DOM**:可能涉及ES6及更高版本的新特性,如箭头函数、模板字符串、Promise等,以及它们在DOM编程中的应用。 10. **DOM库和框架**:介绍jQuery和其他流行的DOM库,如React、Vue等,它们如何...

    JavaScript_DOM编程艺术第二版高清(中文)

    《JavaScript DOM编程艺术第二版高清(中文)》是一本深入探讨JavaScript、DOM(Document Object Model)和HTML5的权威指南,特别适合Web开发人员作为学习和提升技能的参考资料。本书内容丰富,涵盖了大量的实践知识...

    javascript dom 编程艺术

    《JavaScript DOM编程艺术》是一本深受前端开发者喜爱的经典著作,它深入浅出地讲解了JavaScript与DOM(Document Object Model)的交互技术,是web前端开发的重要思想精华。书中的内容涵盖了从基础到高级的DOM操作,...

    javascript DOM编程艺术

    **JavaScript DOM编程艺术** 在Web开发中,DOM(Document Object Model)是HTML和XML文档的结构化表示,它提供了一种标准的方式来访问和操作页面上的元素。JavaScript与DOM的结合,使得开发者能够动态地更新、添加...

Global site tag (gtag.js) - Google Analytics