网站首页 > 技术文章 正文
我说日更就日更,接着....今天从缓冲布局信息开始啦!
-------------------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 });
太晚了,睡觉了,明天再继续,有问题,请多多指教!
- 上一篇: 小程序开发日记三 (轮播图及数据绑定
- 下一篇: 如何加载jquery(如何加载插件)
猜你喜欢
- 2025-05-10 19年前司机被沉尸水库!凶手落网,竟已是身家千万的大老板
- 2025-05-10 常见跨域解决方案(一)(解决跨域的几种方法)
- 2025-05-10 生态文明建设四年巡礼 〉浦城:“三大创新”集成叠加 绿色发展再开新局
- 2025-05-10 福建推进河(湖)长制工作:当好“施工队长”建设八闽幸福河湖
- 2025-05-10 满意在三明 | 三明站附近变美啦,你发现了吗
- 2025-05-10 前端使用FileReader 读取本地文件和校验文件唯一
- 2025-05-10 这是一道“送命题”...辅导孩子写作业,45岁男子被气出脑出血
- 2025-05-10 深入理解Android NDK日志符号化(android日志在什么位置)
- 2025-05-10 中年大叔学编程-微信小程序展示金山词霸每日一句
- 2025-05-10 JavaScript精通到深入(javascript编程精解)
- 05-11CSS:前端必会的flex布局,我把布局代码全部展示出来了
- 05-11Moti:React Native 动画库的新标杆
- 05-11前端开发避坑指南:每天都能用的 CSS3/Less/Sass 实战技巧
- 05-11HarmonyOS:ArkTS 多态样式自学指南
- 05-115 分钟快速上手图形验证码,防止接口被恶意刷量!
- 05-11网页五指棋游戏
- 05-11告别长文焦虑!AI帮你“秒划重点”,文章秒变知识卡片
- 05-11鸿蒙NEXT小游戏开发:数字华容道
- 最近发表
- 标签列表
-
- cmd/c (64)
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- sqlset (64)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- js数组插入 (83)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- outofmemoryerror是什么意思 (64)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)