我们知道,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编程艺术【第2版&高清】.pdf》和描述“JavaScript DOM编程艺术,高清资源,无比经典,值得拥有”,我们可以推断这本书主要讲述了JavaScript中DOM(文档对象模型)的相关编程技术。...
通过学习并实践《JavaScript DOM编程艺术》中的源码,开发者能够掌握原生JavaScript对DOM的精细控制,从而提升网页交互的灵活性和性能。同时,理解并熟练运用这些知识点,对于开发高效、响应式的Web应用至关重要。在...
《JavaScript DOM编程艺术》是一本深受开发者欢迎的JavaScript学习书籍,专注于DOM(Document Object Model)这一核心概念。DOM是Web页面的结构模型,通过JavaScript与DOM的交互,开发者可以实现对网页内容的动态...
### JavaScript DOM编程艺术 第2版 #### 知识点概览 从提供的信息来看,《JavaScript DOM编程艺术 第2版》是一本专注于JavaScript及其与DOM(文档对象模型)交互的书籍。DOM是网页的核心组成部分之一,它定义了...
《JavaScript DOM编程艺术(第2版)》是深入学习JavaScript与DOM操作的重要参考资料,它涵盖了JavaScript语言的基础以及在网页开发中如何有效地利用DOM进行动态交互的高级技术。这本书旨在帮助开发者提升JavaScript...
《JavaScript DOM编程艺术 第2版》是一本深入探讨JavaScript与DOM(Document Object Model)交互的权威书籍。DOM是Web页面的结构化表示,通过JavaScript,我们可以利用DOM来动态地操作HTML和XML文档,实现丰富的交互...
### JavaScript DOM编程艺术知识点概述 #### 一、DOM基础概念 **1.1 DOM简介** DOM(Document Object Model)即文档对象模型,是一种与平台和语言无关的接口,它允许程序和脚本动态地访问和更新文档的内容、结构和...
JavaScript DOM编程艺术是一本专为前端开发者准备的基础教程,它深入浅出地讲解了如何使用JavaScript操作DOM(Document Object Model)来实现动态网页效果。DOM是HTML和XML文档的结构化表示,允许程序和脚本动态更新...
总结以上,要实现高性能的JavaScript DOM编程,关键在于减少不必要的DOM操作,尤其是减少访问和修改DOM的次数。通过在JavaScript中预先处理数据和优化循环结构,可以大幅提高代码的执行效率。此外,对HTML集合进行...
1. JavaScript基础:JavaScript作为一门编程语言,它的基本语法、数据类型、函数、对象等基础知识是学习DOM编程的前提。这本书可能会从这些基础概念讲起,逐步引导读者了解JavaScript的高级特性。 2. HTML和CSS知识...
《高性能JavaScript》揭示的技术和策略能帮助你在开发过程中消除性能瓶颈。你将会了解如何提升各方面的性能,包括代码的加载、运行、DOM交互、页面生存周期等。雅虎的前端工程师Nicholas C. Zakas和其他五位...
### JavaScript DOM编程艺术 #### 一、概述 《JavaScript DOM编程艺术》是一本关于Web设计与JavaScript及文档对象模型(Document Object Model,简称DOM)相结合的专业书籍。本书由Jeremy Keith编写,通过深入浅出...
《高性能JavaScript编程》是著名前端开发者Nicholas C. Zakas所著的一本经典书籍,英文原版名为"High Performance JavaScript"。这本书深入探讨了如何优化JavaScript代码,提升Web应用程序的性能,是JavaScript...
9. **现代JavaScript与DOM**:可能涉及ES6及更高版本的新特性,如箭头函数、模板字符串、Promise等,以及它们在DOM编程中的应用。 10. **DOM库和框架**:介绍jQuery和其他流行的DOM库,如React、Vue等,它们如何...
《JavaScript DOM编程艺术第二版高清(中文)》是一本深入探讨JavaScript、DOM(Document Object Model)和HTML5的权威指南,特别适合Web开发人员作为学习和提升技能的参考资料。本书内容丰富,涵盖了大量的实践知识...
《JavaScript DOM编程艺术》是一本深受前端开发者喜爱的经典著作,它深入浅出地讲解了JavaScript与DOM(Document Object Model)的交互技术,是web前端开发的重要思想精华。书中的内容涵盖了从基础到高级的DOM操作,...
**JavaScript DOM编程艺术** 在Web开发中,DOM(Document Object Model)是HTML和XML文档的结构化表示,它提供了一种标准的方式来访问和操作页面上的元素。JavaScript与DOM的结合,使得开发者能够动态地更新、添加...