js--事件对象和事件委托
2013-03-31 22:07
369 查看
写了段简单事件委托,发觉stopListening一直没有执行handle,原来绑定的事件要一样!!
必须事先指定所有事件处理程序而导致的DOM访问次数,会延迟整个页面的交互就绪事件。
解决 事件处理程序过多 的问题的解决方案就是 事件委托。
原理就是:为了不一个个遍历子节点绑定事件处理程序,把事件处理程序只绑定在包含这些子元素的父元素上,点击子节点,由于事件冒泡,绑定在父元素上的事件处理程序被处理,所以用户看到的效果跟遍历节点绑定事件处理程序的效果一样,而事件目标还是被点击的字节点。
而且如果使用遍历字节点去绑定事件处理程序,如果删除子节点,那些绑定在子节点上的事件处理程序还是没有移除的,必须得手动移除,如:element.onclick=null,而采用事件委托也没有这烦恼
使用事件委托,不仅能提高性能,而且加入绑定事件处理程序的父元素中指向事件源的子元素还是有之前的事件的。一般,因为遍历是在新添加元素之前完成的,所以当我们新添加的元素进去后,事件处理程序是不可能绑定进去的。
有篇文章写得很好:
http://www.html5jscss.com/javascript%E6%AC%B2%E9%80%9F%E5%88%99%E4%B8%8D%E8%BE%BE-%E4%BA%8B%E4%BB%B6%E5%AF%B9%E8%B1%A1%E5%92%8C%E4%BA%8B%E4%BB%B6%E5%A7%94%E6%89%98-101.html
对于为什么要用事件委托:
事件委托是一个解决内存和性能的技巧。首先我们得知道为什么添加到页面上的事件处理数量会影响页面整体的运行性能:
每个函数都是对象,都会占用内存;内存中对象越多,性能越差。必须事先指定所有事件处理程序而导致的DOM访问次数,会延迟整个页面的交互就绪事件。
解决 事件处理程序过多 的问题的解决方案就是 事件委托。
原理就是:为了不一个个遍历子节点绑定事件处理程序,把事件处理程序只绑定在包含这些子元素的父元素上,点击子节点,由于事件冒泡,绑定在父元素上的事件处理程序被处理,所以用户看到的效果跟遍历节点绑定事件处理程序的效果一样,而事件目标还是被点击的字节点。
而且如果使用遍历字节点去绑定事件处理程序,如果删除子节点,那些绑定在子节点上的事件处理程序还是没有移除的,必须得手动移除,如:element.onclick=null,而采用事件委托也没有这烦恼
使用事件委托,不仅能提高性能,而且加入绑定事件处理程序的父元素中指向事件源的子元素还是有之前的事件的。一般,因为遍历是在新添加元素之前完成的,所以当我们新添加的元素进去后,事件处理程序是不可能绑定进去的。
<!DOCTYPE html public "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta name="Keywords" content="简单的XHTML页面" /> <meta name="Description" content="这是一个简单的XHTML页面" /> <title>简单的XHTML页面</title> <style type='text/css'> #ul{ display:table-cell; width:400px; height:400px; list-style:none; font:bold 60px "宋体"; margin:0px; text-align:center; vertical-align:middle; border:1px solid #eee; /* 针对ie的hack */ *display:block; *font-size:175px; } </style> <script type="text/javascript" > var EventUtil = { listenEvent:function(eventTarget,eventType,eventHandler){ eventTarget.addEventListener ? eventTarget.addEventListener(eventType,eventHandler,false): eventTarget.attachEvent? eventTarget.attachEvent("on"+eventType,eventHandler): eventTarget['on'+eventType] = eventHandler; }, stopListening:function(eventTarget,eventType,eventHandler){ console.log("stop"); eventTarget.removeEventListener ? eventTarget.removeEventListener(eventType,eventHandler,false): eventTarget.detachEvent ? eventTarget.detachEvent("on" + eventType,eventHandler): eventTarget['on'+eventType] = null; }, preventDefault:function(eventTarget){ eventTarget.preventDefault ? eventTarget.preventDefault:eventTarget.returnValue = false; }, stopPropagation:function(eventTarget){ eventTarget.stopPropagation ? eventTarget.stopPropagation():eventTarget.cancleBubble = true; }, evt:function(e){ return e || window.event; }, evtTarget:function(e){ return e.target || e.srcElement; } }; window.onload = function(){ var oUl = $("ul"); var handler = function(ev){ console.log(ev); var ev = EventUtil.evt(ev); var target = EventUtil.evtTarget(ev); if(target.nodeName.toLowerCase()=="li"){ target.style.background = "red"; } }; EventUtil.listenEvent(oUl,"mouseover",handler); EventUtil.stopListening(oUl,"mouseout",handler); }; function $(sIdName){ return document.getElementById(sIdName); } /* 没有封装的写法...可以运行 function begin(){ var oUl = $("ul"); oUl.onmouseover = function(ev){ var ev = ev || window.event; //event.stopPropagation(); //event.preventDefault(); var target = ev.target || ev.srcElement; if(target.nodeName.toLowerCase()=="li"){ target.style.background = "red"; } } oUl.onmouseout = function(ev){ var ev = ev||window.event; var target = ev.target ||ev.srcElement; if(target.nodeName.toLowerCase()=="li"){ target.style.background = ""; } } } window.onload = function(){ begin(); } */ </script> </head> <body> <ul id="ul"> <li>lgm</li> <li>zj</li> <li>ljm</li> <li>glt</li> </ul> </body> </html>
有篇文章写得很好:
http://www.html5jscss.com/javascript%E6%AC%B2%E9%80%9F%E5%88%99%E4%B8%8D%E8%BE%BE-%E4%BA%8B%E4%BB%B6%E5%AF%B9%E8%B1%A1%E5%92%8C%E4%BA%8B%E4%BB%B6%E5%A7%94%E6%89%98-101.html
相关文章推荐
- js事件应用--基础(事件对象、鼠标事件、键盘事件)
- js的事件代理/委托
- JS事件绑定、冒泡/捕获、常见的兼容处理、委托、阻止默认行为和冒泡
- 事件委托js
- js 事件对象
- JS事件委托学习(转)
- js学习笔记:对象——行为委托
- js跨浏览器事件对象、事件处理程序
- js如何给页面中所有的img对象加上onclick事件,且实现在新窗体中查看该图片文件
- js中获取事件对象的方法小结
- js中的触发事件对象event.srcElement与event.target详解
- JS获取事件对象,获取事件的源对象(Firefox,IE)
- [转] js中的事件委托或是事件代理详解
- js 中elements能配合那些对象或者事件使用.
- js中获取事件对象的方法小结
- js事件委托机制
- js 与 jquery 事件对象 比较(转)
- JS事件委托的原理和应用
- js动态添加事件-事件委托
- JS动态给对象添加事件的简单方法