一个前端博客(7)——事件绑定和移除事件

//绑定事件
function addEvent(obj, type, fn) {
    if(typeof obj.addEventListener != 'undefined') {
        obj.addEventListener(type, fn, false);
    } else {
        //创建一个存放事件的哈希表
        if(!obj.events) obj.events = {};
        //第一次执行时执行
        if(!obj.events[type]) {
            //创建一个存放事件处理函数的数组
            obj.events[type] = [];
            //把第一次的事件处理函数先存储到第一个位置上
            if(obj['on' + type]) obj.events[type][0] = fn;
        }else{
            //同一个注册函数进行屏蔽,不添加到计数器中
            if(addEvent.equal(obj.events[type], fn)) return false;
        }
        //从第二次开始我们用事件计数器来存储
        obj.events[type][addEvent.ID++] = fn;
        //执行事件处理函数
        obj['on' + type] = addEvent.exec;
    }
}
addEvent.ID = 1;
//执行事件处理函数
addEvent.exec = function(event) {
    var e = event || addEvent.fixEvent(window.event);
    var es = this.events[e.type];
    for(var i in es) {
        es[i].call(this, e);
    }
}
//同一个注册函数进行屏蔽
addEvent.equal = function(es, fn) {
    for(var i in es){
        if(es[i] == fn) return true;
    }
    return false;
}
//把IE常用的Event对象配对到W3C中
addEvent.fixEvent = function(event) {
    event.preventDefault = addEvent.fixEvent.preventDefault;
    event.stopPropagation = addEvent.fixEvent.stopPropagation;
    return event;
};
//IE阻止默认行为
addEvent.fixEvent.preventDefault = function() {
    this.returnValue = false;
}
//IE取消冒泡
addEvent.fixEvent.stopPropagation = function() {
    this.cancelBubble = true;
}
//移除事件
function removeEvent(obj, type, fn) {
    if(typeof obj.removeEventListener != 'undefined') {
        obj.removeEventListener(type, fn);
    }else {
        for(var i in obj.events[type]) {
            if(obj.events[type][i] == fn) {
                delete obj.events[type][i];
            }
        }
    }
}

 

posted @ 2015-10-31 10:34  targeral  阅读(219)  评论(0编辑  收藏  举报