ie7、ie8兼容addEventListener和remove

2016-11-01  本文已影响0人  Aragami

if(document.addEventListener){
    element.addEventListener(type, fun, useCapture);
}else{
    element.addEventListener("on" + type, fun);
}
var addListener = (function(){
    if(document.addEventListener){
        return function(element, type, fun, useCapture){
            element.addEventListener(type, fun, useCapture ? useCapture : false);
        };    
    }else{
        return function(element, type, fun){
            element.attachEvent("on" + type, function(event){
                fun.call(element, event);
            });
        };
    }
})();

但是这样也有个问题,就是detachEvent无法解除监听,因为传递的事件已经改变了。

/**
 * addEventlistener兼容函数
 * ie9以上正常使用addEventlistener函数
 * ie7、ie8用传递的function的function.prototype._bindFun储存经过处理的事件和对应的节点
 * function.prototype._bindFun[index].type:绑定的事件类型
 * function.prototype._bindFun[index].element:绑定的节点
 * function.prototype._bindFun[index].Function:处理的事件
 */

/*** addEventlistener ***/
const addListener = (()=>{
    if(document.addEventListener){
        /* ie9以上正常使用addEventListener */
        return function(element, type, fun, useCapture){
            element.addEventListener(type, fun, useCapture ? useCapture : false);
        };
    }else{
        /* ie7、ie8使用attachEvent */
        return function(element, type, fun){
            if(!fun.prototype._bindFun){
                fun.prototype._bindFun = [];
            }
            // 判断当前的element是否已经绑定过该事件
            let s = true;
            for(const i in fun.prototype._bindFun){
                if(fun.prototype._bindFun[i].type === type && fun.prototype._bindFun[i].element === element){
                    s = false;
                    break;
                }
            }
            // 没有绑定事件
            if(s === true){
                const f = {
                    type: type,
                    element: element,
                    Function: function(event){
                        fun.call(element, event);
                    }
                };
                fun.prototype._bindFun.push(f);
                element.attachEvent(`on${type}`, f.Function);
            }
        };
    }
})();

/*** removeEventlistener ***/
const removeListener = (()=>{
    if(document.addEventListener){
        /* ie9以上正常使用removeEventListener */
        return function(element, type, fun){
            element.removeEventListener(type, fun);
        };
    }else{
        /* ie7、ie8使用detachEvent */
        return function(element, type, fun){
            for(const i in fun.prototype._bindFun){
                if(fun.prototype._bindFun[i].type === type && fun.prototype._bindFun[i].element === element){
                    element.detachEvent(`on${type}`, fun.prototype._bindFun[i].Function);
                    fun.prototype._bindFun.splice(i, 1);
                    break;
                }
            }
        };
    }
})();

上一篇 下一篇

猜你喜欢

热点阅读