《高性能JavaScript》学习笔记(2)——日更中
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了《高性能JavaScript》学习笔记(2)——日更中,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2250字,纯文字阅读大概需要4分钟。
内容图文
我说日更就日更,接着....今天从缓冲布局信息开始啦!
-------------------2016-7-22 21:09:12---------------------------
14、减少对布局信息的查询次数,查询时将他赋值给局部变量参与计算。
例子,在元素网右下方不断平移时,在timeout中可以写:
1 var current = myElement.offsetLeft; 2 current++; 3 myElement.style.left = current + ‘px‘; 4 myElement.style.top = current + ‘px‘; 5if(current > 500){ 6//stop animation7 }
//拒绝下面的写法,每次移动都会查询一次偏移量,导致浏览器刷新渲染队列,非常耗时
1 myElement.style.left = myElement.offsetLeft + ‘px‘; 2 myElement.style.top = myElement.offsetLeft + ‘px‘; 3if(myElement.offsetLeft > 500){ 4//stop animation5 }
15、大量的元素使用:hover之后,页面性能将降低,特别是IE8中。因此强烈建议,在数据量很大的表格中,减少鼠标在表上移动效果,减少高亮行的显示,使用高亮是个慢速过程CPU使用率会提高到80%-90%,尽量避免使用这种效果。
16、事件托管
讲到事件托管,首先我们来看一看冒泡机制:
DOM2级事件规定事件包括三个阶段: ① 事件捕获阶段 ② 处于目标阶段 ③ 事件冒泡阶段
图片引用来源:http://www.w3.org/TR/DOM-Level-3-Events/#event-flow
如下图的实验结果可以知道,当我们点击了inner之后,捕获和冒泡结果如上图的规律相同;
因此,因为每一个元素有一个或多个事件句柄与之相连时,可能会影响性能,毕竟连接每一个句柄都是有代价的,所以我们采用事件托管技术,在一个包装元素上挂接一个句柄,用于处理子元素发生的所有事件。
下面我们以如下的dom结构为例:
假如有一个ul,下面有很多个li:
1 <div> 2 <ul id="ulList"> 3 <li id="item1"></li> 4 <li id="item2"></li> 5 <li id="item3"></li> 6 <li id="item4"></li> 7 <li id="item5"></li> 8 </ul> 9 </div>
当某个Li被点击的时候需要触发相应的处理事件。我们通常的写法,是为每个Li都添加onClick的事件监听。
1 function addListenersLi(liNode){ 2 liNode.onclick = function clickHandler(){} 3} 4 5 window.onload = function(){ 6var ulNode = document.getElementById("ulList"); 7var liNodes = ulNode.getElementByTagName("li"); 8for(var i=0, l = liNodes.length; i < l; i++){ 9 addListeners4Li(liNodes[i]); 10 } 11 }
如果li足够多,或者对于li的操作特别频繁,为每一个li绑定一个点击事件将会特别影响性能,因为在此期间,你需要访问和修改更多的DOM节点,事件的绑定过程发生在onload事件中,绑定本身也非常耗时;同时,浏览器需要保存每个句柄的记录,很占用内存。重点是有些绑定了还不一定会用着,并不是100%的按钮或链接都会被点到的哟!
因此,采用事件托管更为高效,当事件被抛到更上层的父节点的时候,我们通过检查事件的目标对象(target)来判断并获取事件源Li。下面的代码可以完成我们想要的效果:
1 var oul = document.getElementById(‘ulList‘); 2 oul.addEventListener(‘click‘,function(e){ 3var e = e || window.event; 4var target = e.target || e.srcElement; 5 6 console.log(target.nodeName); 7if(target.nodeName == ‘LI‘){ 8//事件真正的处理程序 9 alert(target.id); 10 e.preventDefault(); 11 e.stopPropagation(); 12 }else{ 13 alert(456); 14 } 1516 });
太晚了,睡觉了,明天再继续,有问题,请多多指教!
原文:http://www.cnblogs.com/tiffanybear/p/5697631.html
内容总结
以上是互联网集市为您收集整理的《高性能JavaScript》学习笔记(2)——日更中全部内容,希望文章能够帮你解决《高性能JavaScript》学习笔记(2)——日更中所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。