javascript 事件绑定(兼容各种浏览器)
IE中的 attachEvent 函数在添加事件绑定的时候不传递this对象。这让开发者很纠结,不过有政策就有对策。使用如下方法代替事件绑定函数,兼容各种浏览器。
<script type="text/javascript"> function addEvent(o,e,f) { if(o.addEventListener) { o.addEventListener(e,f,false) } else { var ctype="_"+e,a,i; if(!o[ctype]){ a=o[ctype]=[]; o.attachEvent("on"+e,function(evt){ evt=event; evt.target=event.srcElement; for(var i=0,l=a.length;i<l;i++) a[i].call(o,evt); }); } a=o[ctype]; i=a.length; while(i--)if(a[i]==f)return; a.push(f); } } function delEvent(o,e,f) { if(o.removeEventListener) { o.removeEventListener(e,f,false); } else { var ctype="_"+e; if(o[ctype]) { var a=o[ctype],i=a.length; while(i--) if(a[i]==f) { a.splice(i,1);break; } } } } </script>
addEventListener-事件流(小插曲,只是提醒注意这个知识点)
说到 addEventListener 不得不说到事件流,先说事件流对后面的解释比较方便。
当一个事件发生时,分为三个阶段:
捕获阶段 从根节点开始顺序而下,检测每个节点是否注册了事件处理程序。如果注册了事件处理程序,并且 useCapture 为 true,则调用该事件处理程序。(IE 中无此阶段。)
目标阶段 触发在目标对象本身注册的事件处理程序,也称正常事件派发阶段。
冒泡阶段 从目标节点到根节点,检测每个节点是否注册了事件处理程序,如果注册了事件处理程序,并且 useCapture 为 false,则调用该事件处理程序。
上面提到的 useCapture 也就是 addEventListener 的第三个参数了。
还要谢谢Ander的帮助:http://user.qzone.qq.com/81839603/infocenter#!app=2&pos=1319529117