js 数据存储和DOM编程


Posted in Javascript onFebruary 09, 2017

数据存储

·在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)把元素带回文档中

具体方法有

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

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

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

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

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

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
tagName的使用,留一笔
Jun 26 Javascript
jquery 必填项判断表单是否为空的方法
Sep 14 Javascript
form表单中去掉默认的enter键提交并绑定js方法实现代码
Apr 01 Javascript
利用cookie记住背景颜色示例代码
Nov 04 Javascript
js获取IFRAME当前的URL的方法
Nov 13 Javascript
Jquery获得控件值的三种方法总结
Feb 13 Javascript
Angular ng-repeat指令实例以及扩展部分
Dec 26 Javascript
JS实现类似百叶窗下拉菜单效果
Dec 30 Javascript
AngularJS 限定$scope的范围实例详解
Jun 23 Javascript
荐书|您有一份JavaScript书单待签收
Jul 21 Javascript
JS中async/await实现异步调用的方法
Aug 28 Javascript
jQuery实现数字华容道小游戏(实例代码)
Jan 16 jQuery
超全面的javascript中变量命名规则
Feb 09 #Javascript
简单的jQuery拖拽排序效果的实现(增强动态)
Feb 09 #Javascript
bootstrapValidator.min.js表单验证插件
Feb 09 #Javascript
js 原型对象和原型链理解
Feb 09 #Javascript
AngularJs表单校验功能实例代码
Feb 09 #Javascript
javascript 显示全局变量与隐式全局变量的区别
Feb 09 #Javascript
JS获取本周周一,周末及获取任意时间的周一周末功能示例
Feb 09 #Javascript
You might like
PHP生成不重复标识符的方法
2014/11/21 PHP
php rsa加密解密使用详解
2015/01/14 PHP
php文件上传简单实现方法
2015/01/24 PHP
详谈php静态方法及普通方法的区别
2016/10/04 PHP
thinkphp中AJAX返回ajaxReturn()方法分析
2016/12/06 PHP
浅谈关于PHP解决图片无损压缩的问题
2017/09/01 PHP
php微信公众号开发之校园图书馆
2018/10/20 PHP
关于JavaScript的gzip静态压缩方法
2007/01/05 Javascript
删除javascript中注释语句的正则表达式
2014/06/11 Javascript
基于jQuery Bar Indicator 插件实现进度条展示效果
2015/09/30 Javascript
jQuery基础知识点总结(必看)
2016/05/31 Javascript
浅谈js停止事件冒泡 阻止浏览器的默认行为(阻止超连接 #)
2017/02/08 Javascript
使用jQuery监听扫码枪输入并禁止手动输入的实现方法(推荐)
2017/03/21 jQuery
让div运动起来 js实现缓动效果
2017/07/06 Javascript
Angular通过angular-cli来搭建web前端项目的方法
2017/07/27 Javascript
JS倒计时实例_天时分秒
2017/08/22 Javascript
JavaScript中递归实现的方法及其区别
2017/09/12 Javascript
JS鼠标3次点击事件实现代码及扩展思路
2017/09/12 Javascript
javascript字体颜色控件的开发 JS实现字体控制
2017/11/27 Javascript
vue 中directive功能的简单实现
2018/01/05 Javascript
Python函数中的函数(闭包)用法实例
2016/03/15 Python
Python实现的直接插入排序算法示例
2018/04/29 Python
彻彻底底地理解Python中的编码问题
2018/10/15 Python
Django利用cookie保存用户登录信息的简单实现方法
2019/05/27 Python
对python中的控制条件、循环和跳出详解
2019/06/24 Python
python 实现GUI(图形用户界面)编程详解
2019/07/17 Python
python实现本地批量ping多个IP的方法示例
2019/08/07 Python
Python使用import导入本地脚本及导入模块的技巧总结
2019/08/07 Python
Python定时发送天气预报邮件代码实例
2019/09/09 Python
Flask框架 CSRF 保护实现方法详解
2019/10/30 Python
解决python彩色螺旋线绘制引发的问题
2019/11/23 Python
Python如何将装饰器定义为类
2020/07/30 Python
联想韩国官网:Lenovo Korea
2018/05/10 全球购物
Kivari官网:在线购买波西米亚服装
2018/10/29 全球购物
《桃花心木》教学反思
2014/02/17 职场文书
信息技术研修心得体会
2016/01/08 职场文书