转载自:http://www.cnblogs.com/yugege/p/5169998.html
JavaScript作为一门基于事件驱动的语言(特别是用在DOM操作的时候),我们常常需要为DOM绑定各种各样的事件。然而,由于低版本的IE的不给力,在绑定事件和移除事件监听上都与众不同,我们常常需要自己封装一个跨浏览器绑定(移除)事件的函数。跨浏览器添加(移除)DOM事件的一种非常经典的实现代码如下:
//跨浏览器添加事件 function addHandler(target, eventType, handler) { if(target.addEventListener) { //DOM2 events target.addEventListener(eventType, handler, false); } else { //IE target.attachEvent("on" + eventType, handler); } } //跨浏览器移除事件 function removeHanler(target, eventType, handler) { if(target.removeEventListener) { //DOM2 events target.removeEventListener(eventType, handler, false); } else { //IE target.detachEvent("on", eventType, handler); } }
上面代码的实现思路是,首先判断浏览器是否支持DOM2的事件,如果支持,就用addEventListener()进行添加事件,用removeEventListener来移除事件。如果不支持,那么默认就是低版本的ie浏览器了,并使用ie特有的方法。
//添加事件 function addHandler(target, eventType, handler) { //检测浏览器类型,并且重写addHanler方法 if(target.addEventListener) { //DOM2 addHandler = function(target, eventType, handler) { target.addEventListener(eventType, handler, false); }; } else { //IE addHandler = function(target, eventType, handler) { target.attachEvent("on" + eventType, handler); }; } //调用新的函数 addHandler(target, eventType, handler); } //移除事件removeHanler function removeHandler(target, eventType, handler) { //检测浏览器类型,并且重写removeHandler方法 if(target.removeEventListener) { //DOM2 removeHandler = function(target, eventType, handler) { target.removeEventListener(eventType, handler, false); }; } else { //IE removeHandler = function(target, eventType, handler) { target.detachEvent("on" + eventType, handler); }; } //调用新的函数 removeHandler(target, eventType, handler); }
需要注意的是,我们在两个函数的最后一行,都调用了被重写了的新函数,比如addHandler(target, eventType, handler);和removeHandler(target, eventType,handler);这是必要的,因为我们用新的函数覆盖了旧的函数,必须要在旧的函数里调用新的函数它才会执行一次。
//绑定事件 var addHandler = document.body.addEventListener ? function(target, eventType, handler) { //DOM2 target.addEventListener(eventType, handler,false); } : function(target, eventType, handler) { //IE target.attachEvent("on" + eventType, handler); };
//移除事件 var removeHandler = document.body.removeEventListener ? function(target, eventType, handler) { //DOM2 target.removeEventListener(eventType, handler, false); } : function(target, eventType, handler) { //IE target.detachEvent("on" + eventType, handler); }
这种方法,比前面比前面那种更加的“积极”,因为他是在函数调用之前就已经去检测浏览器类型了,调用的时候马上就可以正确的去绑定事件。
原文:http://www.cnblogs.com/zhangchuanfeng/p/5827260.html