`
rongxh7
  • 浏览: 11955 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

DOM操作的性能优化

阅读更多

DOM操作的性能优化

我们都知道,DOM操作的效率是很低的,尤其是用JS操作DOM的时候,性能的优劣更是引发问题和争论的焦点。 
这里我们先分析一个很简单的例子:

<ul> 
<li>1111</li> 
<li>1111</li> 
<li>1111</li> 
<li>1111</li> 
<li>1111</li> 
<li>1111</li> 
... 
</ul>

假设我们要对上面的1000个或者更多的 li 元素进行抽样显示(隐藏)的控制,照常理来讲,我们会习惯性地去遍历这些元素,加上相应class,或者直接写上内联样式。至少在我看来这是最简单最高效的操作。然而 试验 结果却出乎我的意料,IE和firefox的显示结果都出奇的慢,去网上找了答案:这其实和文档的回流(reflow)很有关系,Nicholas总结了引起reflow的一些因素,其结论就是:

  1. 当对DOM节点执行新增或者删除操作时。
  2. 动态设置一个样式时(比如element.style.width=”10px”)。
  3. 当获取一个必须经过计算的尺寸值时,比如访问offsetWidth、clientHeight或者其他需要经过计算的CSS值(在兼容DOM的浏览器中,可以通过getComputedStyle函数获取;在IE中,可以通过currentStyle属性获取)。

文章地址是:www.nczonline.net/blog/2009/02/03/speed-up-your-javascript-part-4/ 
怿飞师父在他的 blog 里也有提到更详细的因素,有兴趣的可以再去深入研究。 
当然我写这篇文章的目的不是去翻译 Nicholas 的文章或是照搬他们的理论,而是想分享下我 测试 的心得: 
测试地址(慎用,会卡哦~~~^_^):http://www.silentash.com/upload/domscript.html 
     1. 现有主流浏览器对DOM的操作是各自为政的,IE&Chrome reflow过程很短或者说没有reflow,Firefox的reflow现象非常显著(脚本执行之后有很长时间去刷新DOM结构,而且是硬直时间),Opera次之。 
     2. reflow过程中浏览器无法响应用户的操作。 
     3. IE耗费的大部分时间是去获取DOM元素,比如在这个例子中我使用的是常规的getElementById方法,遍历获取元素的时候很耗费时间。而其他浏览器多半时间花在后续的DOM操作中。 
     4. 只添加class不做样式处理不会触发reflow,只更改背景样式也不会触发reflow。 
     5. Nicholas文中提到循环中的语句是会实时触发reflow的,但实际测试的结果是 reflow在执行环境结束之后才被触发Dean Edwards 在其回复中也证实了这一点。 
     6. 同数量的DOM操作,appendChild方法比更改样式的方法高效很多,也就是说display:none引起的reflow消耗比DOM节点的新增或删除要严重(firefox中尤其明显) 
综上几点,再回顾刚才的例子,更高效的方法是用appendChild方法去增加需显示的DOM节点,于是便有了最后的 优化措施: 
     1. 预存储UL下的所有LI元素 
     2. 获取需显示的LI列表 
     3. 删除整个UL元素,这里用的是UL父元素.removeChild(UL),千万不要用innerHTML=”,火狐里会挂的很惨。 
     4. 重建UL元素 
     5. 逐个添加步骤2获得的LI元素到UL 
     6. 添加UL到UL父元素。 
这其中又有Fragment的问题,究竟什么时候该用Fragment?因为fragment仅仅是一个过渡容器,在本质上不能提升代码的效率。所以很简单,当你需要临时容器的时候就用fragment,当你不需要临时容器的时候就可以不用。上面的过程中UL的重建等于是一个fragment,直到所有的LI都添加进去,才append到文档中。上面的例子中,如果用ul.innerHTML = ”,则可以创建一个fragment作为替身…… 
另:例子 中用到的是原生的DOM操作方法,如果用集成库的话性能上还可再优化一些。

分享到:
评论

相关推荐

    (JavaScript)Dom入门35个简单实例

    8. **DOM操作性能优化**:了解如何使用`documentFragment`来批量操作DOM,减少重绘和回流。 9. **表单操作**:DOM也允许对表单元素进行操作,如获取用户输入、验证表单数据和控制表单提交。 10. **DOM事件流**:...

    JavaScript DOM编程艺术源代码

    7. **DOM操作性能优化**:了解如何批量修改DOM,避免不必要的重绘和回流,以及使用`innerHTML`与`createDocumentFragment()`的差异。 8. **DOM2级与DOM3级API**:区分不同级别的DOM标准,如DOM2级引入了样式和事件...

    Ajax完全自学手册-DOM基础及高级DOM技术(word版,附源码)

    2. **DOM操作性能优化**: 避免频繁的DOM操作,可以使用文档片段(`document.createDocumentFragment()`)来一次性添加多个元素,减少浏览器重绘次数。 3. **选择器API**: `querySelectorAll()`和`querySelector()`是...

    前端性能优化探索.pdf

    3. DOM操作优化:DOM操作是JavaScript中最耗费性能的操作之一,因此需要尽可能减少DOM操作的次数。例如,在修改多个元素的类名时,可以创建一个临时节点,然后一次性修改所有元素的类名,最后再删除临时节点。 ...

    HTML文档对象模型

    6. **DOM操作性能优化**:频繁操作DOM会引发浏览器重绘和回流,降低页面性能。因此,可以使用`innerHTML`一次性修改多个元素,或者使用`documentfragment`在内存中构建新的DOM结构,最后再一次性插入到文档中,以...

    自己编写的vc处理xml小程序

    在实际的编程过程中,开发者可能需要处理的问题包括但不限于XML语法错误检查、XPath表达式用于精确定位节点、DOM操作性能优化、错误处理和异常安全等。例如,XPath是一种强大的查询语言,允许快速定位XML文档中的...

    asmdom一个极小的WebAssembly虚拟DOM专注于性能

    asmdom是针对性能优化的虚拟DOM实现,它利用WebAssembly技术来提升前端应用的运行效率。 在现代Web开发中,虚拟DOM(Virtual DOM)是关键组件之一,它允许开发者使用JavaScript操作DOM,但不会立即对实际DOM进行...

    前端性能优化.pptx

    代码级别的优化,例如 Javascript中的DOM 操作优化、CSS选择符优化、图片优化以及 HTML结构优化等等来讲述前端性能优化的多个方式。 目录结构如下: 一、WEB性能优化相关理论 二、前端性能优化的目的 三、前端性能...

    迷你DOM操作库

    迷你DOM操作库是一种轻量级的JavaScript工具集,专门用于简化和加速DOM(Document Object Model)操作。在网页开发中,DOM是HTML或XML文档的结构化表示,它允许我们通过编程方式访问和修改页面元素。这个库因其小巧...

    大型网站性能优化方案

    在构建和运营大型网站的过程中,性能优化是至关重要的环节,它直接影响着用户体验、搜索引擎排名以及服务器资源的利用效率。本文将深入探讨“大型网站性能优化方案”,基于多年的实践经验,为优化工作提供指导。 ...

    前端 - 郭碧青《Web 前端性能优化思路与学习方法》.pdf

    郭碧青是腾讯公司的一位资深前端工程师,他在Web前端性能优化方面有着丰富的实践经验,并且对于性能优化的工作充满热情。郭碧青在行业内的知名度很高,虽然行事低调,但是经常受邀在各种大型会议和技术活动中分享...

    Ractivejs下一代DOM操作框架

    6. 性能优化:Ractive.js允许设置延迟更新或批量更新,以减少频繁的数据变更触发的渲染。此外,它可以对数据模型进行观察,仅在需要时才触发视图的更新,进一步提升性能。 7. 社区支持:虽然Ractive.js不像React或...

    移动互联网应用的性能优化

    ### 移动互联网应用的性能优化 随着移动互联网技术的发展,移动应用已成为用户日常生活中不可或缺的一部分。为了提高用户体验,移动应用的性能优化变得至关重要。本文将深入探讨移动互联网应用性能优化的关键方面...

    web前端性能优化

    CSS优化主要包括移除未使用的CSS、合并同类选择器、利用CSS3的性能特性来减少DOM操作等。精简和优化CSS可以减少样式渲染的计算量,提高页面渲染效率。同时,合理使用CSS预处理器可以提高样式的编写效率,压缩CSS文件...

    前端性能优化知识图谱指导

    JS性能优化是指在JavaScript代码的编写和执行过程中,通过一系列的优化策略和技术手段,提高代码的执行效率和性能,从而提升网页或应用程序的响应速度和用户体验。 优化JS性能的方法包括但不限于以下几个方面: 代码...

    前端性能优化指南

    ### 前端性能优化指南 #### 概述 前端性能优化是指通过对网站或Web应用的前端部分进行改进,以提升用户体验的过程。优秀的前端性能优化能够显著提高网页加载速度、减少资源消耗、增强用户交互体验,进而提升整体的...

    DOM-manipulation:DOM操作的简要研究资源

    5. **DOM操作性能优化** - 大量的DOM操作可能会影响页面性能,因为浏览器需要重新渲染。因此,可以使用`createDocumentFragment`创建一个临时的DOM片段,进行多次操作后一次性插入到真实DOM中。 - 使用CSS选择器...

    Javascript_Dom操作案例

    - 优化性能,避免不必要的DOM操作,如在循环中频繁访问DOM。 在提供的`Dom经验文档.rar`中,可能包含了一些实践经验、技巧和常见问题的解决方案,建议详细阅读以加深理解。`TestDomWebsite`可能是一个测试网站,你...

Global site tag (gtag.js) - Google Analytics