一个前端博客(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]; } } } }