//绑定事件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]; } } }}