js 数据存储和DOM编程

作者:小蚊 时间:2024-02-24 07:52:31 

数据存储

·在javascript中,数据存储的位置会对代码整体性能产生重大的影响。

·数据存储共有4种方式:字面量、变量、数组、对象成员。

·要理解变量的访问速度,就要理解作用域。由于局部变量处于作用域的起始位置,因此访问速度比访问跨域作用域变量(即除起始位置之外的外层作用域变量)更快。即变量处在作用域的位置越深,访问速度越慢。这也就说明,访问全局变量的速度是最慢的。 总的来说,字面量和局部变量的访问速度快于数组和对象成员的访问速度。 

因此,常见的一些提高数据访问速度的方法有:

①避免使用with、try-catch中的catch语句,因为它会改变执行环境的作用域链。

②尽量少用嵌套对象、避免对象嵌套过深。

③可以把常需要访问的对象成员、数组项、跨域变量保存在局部变量中。

DOM编程

我们知道用javascript操作DOM会影响性能,这是为什呢。这个问题是“天生”的。

因为DOM是一个独立于语言的,用于操作XML和HTML文档的程序接口,而客户端脚本编程大多数时候是和底层文档打交道。所以推荐的做法就是尽可能少操作DOM。

有这么一些小技巧:

①如果需要多次访问某个DOM节点,使用局部变量存储它的引用。

②小心处理HTML集合,因为它实时联系着底层文档。

例如:


var divs= document.getElementsByTagName('div');
for(var i = 0;i < divs.length; i++){
document.body.appendChild(document.creatElement('div'))
}

这是一个死循环,原因就是divs.length每次迭代都会增加,它反映的是底层文档的当前状态。

因此,我们在需要遍历某个HTML集合的时候,可以先把长度缓存起来再使用。而如果是要经常操作的集合,可以把整个集合拷贝到一个数组中。

③使用一些速度更快的API

例如:


childNodes -> children
childElementCount -> childNodes.length
firstElementChild -> firstChild
lastElementChild -> last Child
getElementByTagName ->querySelectorAll

④注意重绘和重排

1.由于每次重排都会产生计算消耗,大多数浏览器通过队列化修改并批量执行来优化重排过程。

而获取布局信息的操作会导致队列刷新,如下方法:

offsetTop,offsetLeft,offsetWidth,offsetHeight、
scrollTop,scrollLeft,scrollWidth,scrollHeight、
clientTop,clientLeft,clientWidth,clientHeight、
getComputedStyle

因为这些属性或方法需要返回最新的布局信息,因此浏览器不得不执行渲染列队中的“待处理变化”并触发重排以返回正确的值。

2.最小化重绘和重排,合并多次对DOM和样式的修改,如


var el = document.getElementById('mydiv');
el.style.margin = '5px';
el.style.padding = '2px';
el.style.borderLeft= '5px';

以上,修改了三个样式,每个都会影响元素的几何结构,最糟糕的情况下会导致三次重排(大部分现代浏览器为此做了优化,只会触发一次)

可以被优化为:


var el = document.getElementById('mydiv');
el.style.cssText = 'margin = '5px';padding = '2px';borderLeft= '5px';

3.需要对DOM元素进行一系列操作时,可以通过以下步骤:

1)使元素脱离文档流

2)对其应用多重改变

3)把元素带回文档中

具体方法有

     ·隐藏元素、应用修改、重新显示

     ·使用文档片段,在别的地方构建一个子树,再把它拷贝回文档

     ·将原始元素拷贝到一个脱离文档的节点,修改后再替换原始元素

⑤动画中使用绝对定位,使用拖放代理。

⑥使用事件委托来减少事件处理器的数量。

来源:http://www.cnblogs.com/LuckyWinty/p/6378606.html

标签:js,数据存储,DOM编程
0
投稿

猜你喜欢

  • SQL Server误区30日谈 第29天 有关堆碎片的误区

    2024-01-20 06:20:06
  • 如何利用insert into values插入多条数据

    2024-01-24 04:39:54
  • Python实现特定场景去除高光算法详解

    2021-11-16 09:50:03
  • PHP网站建设的流程与步骤分享

    2023-07-07 00:28:26
  • Java通过MyBatis框架对MySQL数据进行增删查改的基本方法

    2024-01-17 10:27:12
  • Oracle 数组的学习 小知识也要积累,养成好的学习态度

    2009-08-04 12:42:00
  • 详解Python中如何写控制台进度条的整理

    2023-12-31 03:32:51
  • 用python写扫雷游戏实例代码分享

    2023-03-31 05:12:38
  • python跳过第一行快速读取文件内容的实例

    2022-05-12 12:58:56
  • WAP中的ASP技术

    2008-05-18 13:30:00
  • JS严格模式知识点总结

    2024-05-13 10:06:42
  • fastapi与django异步的并发对比分析

    2023-01-03 19:49:30
  • 如何优雅、安全的关闭MySQL进程

    2024-01-27 06:33:27
  • Python企业编码生成系统之系统主要函数设计详解

    2021-05-11 20:43:49
  • python matplotlib工具栏源码探析二之添加、删除内置工具项的案例

    2022-05-16 19:31:22
  • asp如何使用Office Chart 9.0 制作图表?

    2010-06-05 12:41:00
  • asp智能脏话过滤系统v1.0

    2011-04-14 11:00:00
  • sql server 创建临时表的使用说明

    2024-01-16 18:30:23
  • 微信小程序(订阅消息)功能

    2024-04-28 09:36:48
  • 关于python中逆序的三位数

    2021-08-09 05:17:28
  • asp之家 网络编程 m.aspxhome.com