`
wangemperor
  • 浏览: 40180 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

高效http页面优化法则【JS对DOM的操作】

 
阅读更多

 

很多人都认为JS的效率太慢了,都不愿意用js来实现相对困难一点的程序逻辑。在这里我要说的是其实js的效率并不慢,慢的是DOM,如果操作好DOM,你的js效率将提高接近千倍(这并不是什么夸张的数字)。

1. 批量增加Dom

尽量使用修改innerHTML的方式而不是用appendChild的方式; 因为使用innerHTML开销更小,速度更快,同时也更加内存安全.

有 一点需要注意的是,用innerHTML方式添加时,一定不要在循环中使用 innerHTML += 的方式添加,这样反而会使速度减慢; 而是应该中间用array缓存起来,循环结束后调用 xx.innerHTML = array.join(‘’);的方式,或者至少保存到string中再插到innerHTML中.

针对用户列表一块采用这种方式优化后,加载速度提升一倍.

2. 单个增加Dom

这里是指要将新节点加载到一个内容不断变化的节点的情形,对于内容稳定的节点来说,随便怎么加都没有问题. 但是对于有动态内容的节点来说,为其添加子节点尽量使用 dom append的方式.

这是因为,dom append不会影响到其他的节点;而如果修改innerHTML属性的话,该父节点的所有子节点都会从dom树中剥离,再根据新的innerHTML值来重绘子节点dom树;所有注册到原来子节点的事件也会失效.

综上,如果在一个有动态内容的节点上 出现了 innerHTML += 的代码,就该考虑是否有问题了.

3. 创建Dom节点

用 createElement方式创建一个dom节点,有一个很重要的细节: 在执行完createElement代码之后,应该马上append到dom树中; 否则,如果在将这个孤立节点加载到dom树之前所做的赋值它的属性和innerHTML的操作都会引发该dom片段内存无法回收的问题. 这个不起眼细节,一旦遇到大量dom增删操作,就会引发内存的灾难.

4. 删除Dom节点

删除dom节点之前,一定要删除注册在该节点上的事件,不管是用observe方式还是用attachEvent方式注册的事件,否则将会产生无法回收的内存.

另,在removeChild和innerHTML=’’二者之间,尽量选择后者. 因为在sIEve(内存泄露监测工具)中监测的结果是用removeChild无法有效地释放dom节点.

5. 创建事件监听

现有的js库都采用observe方式来创建事件监听,其实现上隔离了dom对象和事件处理函数之间的循环引用,所以应该尽量采用这种方式来创建事件监听.

6. 监听动态元素

Dom 事件默认是向上冒泡的,发生在子节点中的事件,可以由父节点来处理. Event的 target/srcElement 仍是产生事件的最深层子节点. 这样,对于内容动态增加并且子节点都需要相同的事件处理函数的情况,可以把事件注册上提到父节点上,这样就不需要为每个子节点注册事件监听了.

同时,这样做也避免了产生无法回收的内存.即使是用Prototype的observe方式注册事件并在删除节点前调用stopObserving,也会产生出少量无法回收的内存,所以应该尽量少的为dom节点注册事件监听.

所以,当代码中出现在循环里注册事件时,也是我们该考虑事件上提机制的时候了

分享到:
评论

相关推荐

    Algorithm-nanomorph.zip

    总之,"Algorithm-nanomorph.zip"中的算法为我们提供了一个高效、精准的DOM更新工具,它通过深度比较和最小化DOM操作,实现了对真实DOM节点的超快速扩散。对于那些追求高性能、低延迟的Web应用程序来说,nanomorph...

    jquery+js瀑布流

    jQuery是一个轻量级的JavaScript库,简化了DOM操作、事件处理、动画制作等任务,使得开发者能够更高效地实现动态效果。JavaScript则负责处理页面的交互逻辑,比如窗口大小变化时的重新布局。 首先,我们需要在HTML...

    J2EE高性能编程

    对JavaScript文件进行压缩、合并等操作可以减少HTTP请求次数和文件大小,从而加快页面加载速度。 - **使用Eval消耗大量性能** `eval()`函数可以执行动态生成的代码,但它的性能较差且存在安全隐患。应尽量避免...

    Programacao_WEB:学科法则

    随着Web开发的复杂性增加,JavaScript库和框架应运而生,如jQuery简化了DOM操作,React和Vue.js提供了组件化开发方式,Angular则是一个全面的MVC框架。理解这些工具的工作原理和使用方法,能极大地提高开发效率。 ...

    数据结构和算法.rar

    例如,优化DOM操作时,可以利用哈希表减少查找时间;使用栈来管理页面的浏览历史;通过动态规划解决复杂的布局问题;使用分而治之策略优化递归计算等。因此,作为前端开发者,掌握这些基本概念和技术不仅能提升代码...

    前端大厂最新面试题-开放性问题(带答案).docx

    开发者需要从多个维度去优化前端性能,包括但不限于减少HTTP请求次数、使用CDN、合理利用缓存策略、优化脚本加载、减少DOM操作、使用事件委托、压缩资源、代码拆分和懒加载等。这些方案都是为了减少页面加载时间、...

    Java教科書

    这本手册可能包含变量、函数、对象、DOM操作、事件处理以及AJAX(Asynchronous JavaScript and XML)等内容,是开发者快速查找和学习JavaScript语法的实用工具。 **4. JSP(JavaServer Pages)** JSP是Java的一个...

    regra3:三个脚本的规则

    - **行为层**(JavaScript):负责增加交互性和动态功能,通过事件监听和DOM操作实现。 总结来说,"Regra3:三个脚本的规则"可能是一个指导Web开发者如何有效利用HTML、CSS和JavaScript的框架,强调它们间的协同工作...

    一个效果写的HashTable代码

    在某些编程语言中,如Java和Python,已经提供了现成的HashTable实现,分别是HashMap和dict,它们内部都优化了哈希表的使用,并提供了高效的键值对操作接口。 文档中提到的“Ctrl+A全选”,这通常是文档编辑器或...

    亮剑.NET深入体验与实战精要2

    15.1 高效C#编码优化 526 15.2 页面(HTML)优化的方法 534 15.3 ASP.NET开发性能优化 540 15.3.1 如没必要,尽量使用静态HTML页面 540 15.3.2 避免不必要的回送操作 541 15.3.3 尽量在客户端进行用户输入验证 541 ...

    亮剑.NET深入体验与实战精要3

    15.1 高效C#编码优化 526 15.2 页面(HTML)优化的方法 534 15.3 ASP.NET开发性能优化 540 15.3.1 如没必要,尽量使用静态HTML页面 540 15.3.2 避免不必要的回送操作 541 15.3.3 尽量在客户端进行用户输入验证 541 ...

    buscador-de-peliculas-con-svelte

    Svelte.js是近年来崛起的一款轻量级、高性能的前端框架,以其编译时优化的特点著称,能够将复杂的UI逻辑转化为高效的JavaScript代码,从而在运行时提供优秀的性能。 【描述】提到的应用是一个基于OMDb (Open Movie ...

    中科院高级软件工程期末题库

    TDD 的过程通常被称为“红-绿-重构”:首先编写一个失败的测试(红),接着编写最少的代码让测试通过(绿),最后对代码进行重构以优化其结构和性能。这种方法有助于确保代码的质量,并且能够及时发现潜在的问题。 ...

    php笔试题 百度

    MySQL数据库基本的三个优化法则** - **服务配置**: 调整内存、缓存设置。 - **应用**: 使用索引、减少连接次数。 - **开发**: 优化SQL语句、减少不必要的查询。 #### 三、综合技术题 **1. 产生 Image 标签的方法...

Global site tag (gtag.js) - Google Analytics