我说日更就日更,接着....今天从缓冲布局信息开始啦!
-------------------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‘; 5 if(current > 500){ 6 //stop animation 7 }
//拒绝下面的写法,每次移动都会查询一次偏移量,导致浏览器刷新渲染队列,非常耗时
1 myElement.style.left = myElement.offsetLeft + ‘px‘; 2 myElement.style.top = myElement.offsetLeft + ‘px‘; 3 if(myElement.offsetLeft > 500){ 4 //stop animation 5 }
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(){ 6 var ulNode = document.getElementById("ulList"); 7 var liNodes = ulNode.getElementByTagName("li"); 8 for(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){ 3 var e = e || window.event; 4 var target = e.target || e.srcElement; 5 6 console.log(target.nodeName); 7 if(target.nodeName == ‘LI‘){ 8 //事件真正的处理程序 9 alert(target.id); 10 e.preventDefault(); 11 e.stopPropagation(); 12 }else{ 13 alert(456); 14 } 15 16 });
太晚了,睡觉了,明天再继续,有问题,请多多指教!