前言

因为浏览器中通常会将DOM和javascript独立实现,两个相互独立的功能需要通过接口彼此链接,就会产生新能上的消耗。访问DOM就会产生消耗,修改DOM的影响更大。因此,减少对DOM的操作,把运算多留在ECMAScript中处理是理想的选择。

DOM元素和方法

在操作DOM元素的方法中,有返回html集合的方法,也有返回Nodelist(一个对元素的引用列表)的方法。

返回html集合的方法(html集合与文档保持连接,文档更新,集合就会随之更新,因此使用html进行一些遍历操作或者别的操作,会非常低效):

document.getElementsByName()
document.getElementsByClassName()
document.getElementsByTagName()
复制代码

返回Nodelist的方法(包含返回节点的类数组对象):

document.querySelectorAll('css selector')
document.querySelector('css selector')
复制代码

重绘和重排

浏览器在下载完页面中的资源后(JS,CSS,HTML,图片),会解析生成两个内部的数据结构——DOM树(表示页面结构)和渲染树(表示DOM节点如何显示)。

当修改DOM的几何属性之后,浏览器会使渲染树中受到改变和影响的部分失效,重新构造对应的渲染树,这个过程称作“重排”。完成重拍后,浏览器将重新绘制受影响的部分到屏幕中,这个过程称为“重绘”。

何时会发生重排:

1、添加、删除可见的DOM元素
2、改变DOM元素的大小,边距等。
3、改变DOM元素的位置。
4、DOM元素的内容发生改变,文本或者图片等。
5、页面渲染初始化和浏览器窗口的改变。
复制代码

由于每次重排都会产生性能消耗,浏览器会通过队列化批量执行的方式来优化重排过程。但是,在一些对DOM的操作中,会无意间刷新队列立即执行重排:

1、offsetTop。。。
2、scrollTop。。。
3、clientTop。。。
4、getComputedStyle()
复制代码

以上操作需要获取实时的布局信息,因此不等不让浏览器强制刷新队列以返回正确值。

批量修改DOM降低重排重绘的频率以提升性能

基本思路是,将需要批量修改的DOM从文档流中摘出来(也可以是复制出来),然后对其一顿操作,再把操作后的部分放回去。

有集中方法可以使DOM脱离文档流:

1、隐藏DOM元素
2、创建一个文档片段(document fragment)
3、将原始的DOM元素拷贝出来,修改后替换原文档
复制代码

转载于:https://juejin.im/post/5cffb928e51d4510617210a4

DOM编程中,提高程序运行速度需要注意的一些点相关推荐

  1. 提高程序运行速度的方法

    1.选择一组合适的算法和数据结构: 2.编写出编译器能够有效优化的源代码:(编写程序方式中一点小小的变动,都会引起编译器优化方式的很大变化,必须了解编译器的能力和局限性,有些编程语言比其他语言容易优化 ...

  2. Symbian S60v5 编程中的程序图标更换问题

    这个换图标的问题也是折腾了我挺久一段时间,非常郁闷,不就换个图标嘛,想当年大学时在MFC编程中,多么简单的一件事件,在Symbian下却搞了很久,在网上查了很久,发现基本都是说第三版或者是Anna下换 ...

  3. 易语言内存不能为read错误解决方案和提高程序运行速度

    点击阅读原文 大家在编程的时候,都会出现 内存不能为read错误 的错误 可能是在调试的时候,也可能是在编译出来的程序中发生 其实最令人讨厌的莫过于...在调试中无错,在编译后出错 --------- ...

  4. C++中提高程序运行效率的方法集合

    引言 由于其体系比较庞大,介于个人也是在不断完善和探索,故而此文是一个长期不定时更新的状态. 要点记录 函数在参数传递时,尽可能根据当时的情况,使用引用传递:(引用是一种别名,不涉及变量的拷贝带来的开 ...

  5. 怎么提高计算机编程能力,提高程序员技能的11招编程技巧

    1.清晰的分析问题 2.三思而后行如何解决这个问题 3.收集完整的需求. 花点时间,想好产品的目标形态和最终的用户群.在这个阶段思路清晰会给以后节省很多时间. 4.写一个执行计划 对于比较大的项目,将 ...

  6. c# 定位内存快速增长_C# ASP.NET 优化程序性能、降低内存使用、提高程序运行速度...

    首先纪念一下今天的股票大跌抓个图,虽然我自己损失不是很大,但是应该大多人都损失不小.也可能有人会继续跳楼,也可能是股市一个新的转折点来了. 接着还是重点关注自己写代码优化的主题吧.软件系统当访问量不大 ...

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

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

  8. 在dom最前面插入_前端性能优化之dom编程

    写在前面 总所周知,在前端的日常里面,采用JS操作DOM节点的情况占据了大多数.虽然现在有MVVM主流框架代替我们做了这些事情,但充分理解在DOM操作各种损耗问题,将有助于让我们更加理解和优化问题. ...

  9. Windows用户界面编程中的界面闪烁问题

    http://yyf9989.cnblogs.com/archive/2005/09/02/228320.html Windows用户界面编程中的界面闪烁问题 南京千里独行版权所有转载请保留本信息 在 ...

最新文章

  1. 从0开始搭建坚不可摧的Web系统主流架构
  2. TI-DM8127:MCFW、ISS中对sensor的驱动和控制
  3. 三大缓存框架ehcache、memcache和redis的介绍
  4. [导入]使用tomcat5.0自带的连接池
  5. 1.1.2 标准化工作及相关组织
  6. 如何成为有效学习的高手(许岑)——思维导图
  7. python单元格内换行_Python Pandas可防止单元格中的换行符
  8. 4. Jmeter主界面的介绍
  9. 云杰恒指:8.30恒指期货早盘资讯
  10. 输入月份自动生成excel考勤表,周末高亮,内容可以勾选
  11. 近日,百度《互联网从业人员单身情况调查报告》新鲜出炉,调查人群是日前火了一把的西二旗互联网从业者(转载)
  12. 【Django | 安全防护】CSRF跨站伪请求和SQL注入攻击
  13. Angular项目中使用echarts中国地图
  14. T568A标准和T568B标准
  15. 2023年必须收藏的python兼职网站大全
  16. Kotlin 喧嚣过后,Java 程序员未来在哪里
  17. Project2007企业项目管理实践
  18. 时间简史史蒂芬·霍金
  19. Mysql进阶三板斧(一)带你彻底搞懂View视图的原理及应用
  20. grasemonkey ajax页面,最新的Tampermonkey/Greasemonkey是否仍然不能使用jQuery AJAX?

热门文章

  1. python单行箭头_python – 如何在matplotlib的曲线末端放置一个箭头?
  2. MySQL数据库:SQL语句
  3. python爬取抖音用户数据_python批量爬取下载抖音视频
  4. 360导入html没有,IE无法加载到外部CSS样式, 用360浏览器就可以,上CSS引用代码[急]_html/css_WEB-ITnose...
  5. 如何阅读一本书 pdf_如何2个小时内快速阅读一本书?
  6. java connection 可以有多个statement 吗,JDBC多线程多个statement共享同一个connection
  7. unity调用普通java类_Unity中C#和Java的相互调用实例代码
  8. hive桌游中文规则_超火爆轻策桌游《小小城镇》新扩展——小金币大作为,邀你共筑繁荣小镇!...
  9. PAT1052---------初步了解正则表达式
  10. Vue学习之路1 小白起步