JavaScript针对Dom相关的优化心得

组内同时总结的关于javascript性能优化注意些节。记录一下。

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 节点注册事件监听 .

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

7. HTML 提纯

HTML 提纯体现的是一种各负其责的思想 . HTML 只用来显示 , 尽量不出现和显示无关的属性 . 比如 onclick 事件 , 比如自定义的对象属性 .

事件可以用前面的方法避免 , 对象属性指的是这样的一种情景 : 通常情况下 , 动态增加的内容都是有个对象和它对应 , 比如聊天室的用户列表 , 每个显示用户的 dom 节点都有一个 user 对象和它对应 , 这样在 html 中 , 应该仅保留一个 id 属性和 user 对象对应 , 而其他的信息 , 则应通过 user 对象去获取 .

J​a​v​a​S​c​r​i​p​t​针​对​D​o​m​相​关​的​优​化​心​得...相关推荐

  1. 基于 J a v a S c r i p t 与 D B G R I D控件的 B / S结构客户端联想式录入技术的设计与实现

    基于 J a v a S c r i p t 与 D B G R I D控件的 B / S结构客户端 联想式录入技术的设计与实现 赵成勇, 周  南, 邱小彬 ( 中国农业大学网络中心, 北京 1 0 ...

  2. R语言使用lm构建线性回归模型、并将目标变量对数化(log10)实战:可视化模型预测输出与实际值对比图、可视化模型的残差、模型预测中系统误差的一个例子 、自定义函数计算R方指标和均方根误差RMSE

    R语言使用lm构建线性回归模型.并将目标变量对数化(log10)实战:可视化模型预测输出与实际值对比图.可视化模型的残差.模型预测中系统误差的一个例子 .自定义函数计算R方指标和均方根误差RMSE 目 ...

  3. R语言使用lm构建线性回归模型、并将目标变量对数化实战:可视化模型预测输出与实际值对比图、可视化模型的残差、模型系数(coefficient)、模型总结信息(summary)、残差总结信息

    R语言使用lm构建线性回归模型.并将目标变量对数化(log10)实战:可视化模型预测输出与实际值对比图.可视化模型的残差.模型系数(coefficient).模型总结信息(summary).残差总结信 ...

  4. R语言使用lm构建线性回归模型、并将目标变量对数化实战:模型训练集和测试集的残差总结信息(residiual summary)、模型训练(测试)集自由度计算、模型训练(测试)集残差标准误计算

    R语言使用lm构建线性回归模型.并将目标变量对数化实战:模型训练集和测试集的残差总结信息(residiual summary).模型训练(测试)集自由度计算.模型训练(测试)集残差标准误计算(Resi ...

  5. R语言使用caret包构建GBM模型:在模型最优参数已知的情况下,拟合整个训练集,而无需进行任何重采样或参数调优

    R语言使用caret包构建GBM模型:在模型最优参数已知的情况下,拟合整个训练集,而无需进行任何重采样或参数调优 目录 R语言使用caret包构建GBM模型:在模型最优参数已知的情况下,拟合整个训练集 ...

  6. R语言构建决策树(decision trees)模型并进行调优和解释

    R语言构建决策树(decision trees)模型并进行调优和解释 目录 R语言构建决策树(decision trees)

  7. V​M​W​a​r​e​里​安​装​6​4​位​L​i​n​u​x​ ​的​方​法

    1.CPU AMD系列的CPU略过 Intel系列的CPU芯片需要支持EM64T和VT技术才行,并且BIOS也要支持才可以. 为了确定你的Intel CPU是否支持VT,请查看: http://com ...

  8. L​I​N​U​X​环​境​中​部​署​J​A​V​A​项​目​步​骤

    http://wenku.baidu.com/link?url=UtTmTn_s1cxOZSXvgmBrNy97pPks07sBvbQzzTv61i3ebpl2JygZqBSJxh0CxFXvEBls ...

  9. SAS多元线性回归分析与残差分析(画残差图,残差的正太概率图含变量交叉项,写残差向量,计算回归系数的置信区间,检验自变量系数是否相等,利用R²,MSE,CP,PRESS准则和逐步回归法选择最优方程)

    例题: 1. 某科学基金会的管理人员希望估计从事数学研究工作的中等或较高水平的数学家的年工资额Y与他们的研究成果(论文.著作等)的质量指标X1,从事研究工作的时间X2以及能成功获得资助的指标X3之间的 ...

最新文章

  1. 对相机所看的视角截屏保存为图片
  2. Deactivate .NET refector
  3. 【小白学PyTorch】8.实战之MNIST小试牛刀
  4. kafka 名词解释及原理解析过程(三)
  5. 在ubuntu上安装apc扩展
  6. Python | Xpath实战训练
  7. python实现根据文件名找出(拷贝/剪切)同名文件的不同类型文件
  8. Spring Hibernate集成示例教程
  9. java多进程_Java中创建多进程
  10. java中String、StringBuffer和StringBuilder的区别(简单介绍)
  11. Buckhorn跳羚声卡驱动安装设置方法
  12. python绘图--由逐日风场数据计算月平均风场数据并绘制二维填色图
  13. stata学习笔记|基本知识
  14. FDTD快速入门之Lumerical脚本语言Pickup(七)数据获取与分析(Analysis)
  15. linux没有系统如何删除sda,Linux:解决U盘可以识别,但在/dev目录下只有sda,却无设备节点(sda1)的问题...
  16. Matplotlib显示图例
  17. java 读取Excel
  18. python股票基本面分析_python之股票数据分析
  19. JZOJ 5539 psy
  20. 几种常见卷积神经网络结构

热门文章

  1. 浪潮全球化的一面:从OEM到JDM,从ODCC到OCP
  2. 微信昵称乱码 mysql_微信昵称乱码及mysql编码格式设立(utf8mb4)_mysql
  3. Python-OpenCV 实现美图秀秀视频剪辑效果【转场】
  4. 技巧:修改Chrome默认搜索引擎为Google.com
  5. 【PR 基础】轨道遮罩键、交叉溶解的简单使用
  6. adb环境搭建以及使用教程
  7. Deepin搭建Qt5开发环境
  8. lpc1768的gpio库函数_LPC1768之GPIO输入和输出配置基础例程
  9. (Linux)进程间通信
  10. 【练习赛】2022年高教杯数学建模C题(第一题的第二小问)