深刻理解事件委托或者事件代理
来源:互联网 发布:传奇世界翅膀进阶数据 编辑:程序博客网 时间:2024/06/02 06:40
概述:
事件委托 是利用事件冒泡,只指定一个事件处理程序,就可以管理某一类型的所有事件。优势(去快递事件,新员工)。
原因:
在js中,添加到页面上的事件处理程序数量关系到页面的整体运行性能,用for循环遍历所有li,给他们添加事件,不断与dom节点进行交互,访问dom越多,引起浏览器的重绘与重排的次数就越多,延长整个页面的交互就绪时间。优化思想之一减少dom操作原因。如果使用事件委托,所有操作都在js里,与dom的操作只交互一次,大大减少与dom的交互次数,提高性能。
原理:
利用事件冒泡原理实现。事件冒泡,事件从最深的节点开始,逐步向上传播事件。ul>li,给li添加click事件,执行顺序li>ul, 给ul添加事件,点击li时,会出发,这就是事件委托,委托他们父级代为执行事件。
实现:
Event对象提供了一个属性target,可以返回事件的目标节点。标准浏览器使用ev.target,IE浏览器用event.srcElement。
- 相同效果:
var oUl = document.getElementById("ul1");oUl.onclick = function(ev){ var ev = ev || window.event ; var target = ev.target || ev.srcElement; if(target.nodeName.toLocaleLowerCase() == "li"){ alert(target.innerHTML) }}
- 不同效果:
var oBox = document.getElementById("box");oBox.onclick = function(ev){ var ev = ev || window.event; var target = ev.target || ev.srcElement; if(target.nodeName.toLocaleLowerCase() == "input"){ switch(target.id){ case "add": var aLi = document.createElement("li"); aLi.innerHTML = "555"; oUl.appendChild(aLi); break; case "remove": alert("remove"); break; case "move": alert("move"); break; case "select": alert("select"); break; } }}
- 测试:
$("#ul1").on("click","li",function(e){ e.stopPropagation(); alert(123)})
总结:
适合用事件委托的事件:click,mousedown,mouseup,keyup,keypress。
注意:mouseover与mousemove有事件冒泡,但是要计算位置。
不适合:mouseover,focus,blur。后两个无冒泡特性。
事件触发顺序: 事件触发顺序:keydown - > keypress - > keyup
0 0
- 深刻理解事件委托或者事件代理
- 深刻理解:C#中的委托、事件
- 深刻理解:C#中的委托、事件
- 事件代理和事件委托
- js事件委托(事件代理)
- JavaScript 事件委托/事件代理
- JavaScript事件委托/事件代理
- javascript-委托事件(事件代理)
- js 事件委托(事件代理)
- 事件委托和事件代理
- 事件委托或事件代理
- js事件委托/代理
- 我理解的ajax 跨域 事件代理,委托20170222am
- 委托 事件 代码理解
- c#委托、事件理解
- 理解委托与事件
- C#委托事件理解
- 事件委托原理理解
- yuekaoButton1
- 2015蓝桥杯省赛——叠骰子(第9题,DP)
- mybatis 代码自动生成
- 算法训练 大小写转换
- 如何结束一个while(cin>>s)的循环
- 深刻理解事件委托或者事件代理
- 范德蒙恒等式的证明
- lpsolve初次使用
- Leetcode:Coin Change 2
- 菱形
- [蓝桥杯]-分糖果
- Android序列化问题-Parcelable和Serializable
- Android 打印Log.v Log.d Log.i Log.w Log.e
- Linux中Nginx安装与配置详解