事件绑定(2)
完美版事件绑定处理函数,解决了所有IE现代事件绑定的问题,直接看代码:
1 function addEvent(obj, type, fn) { 2 if (typeof window.addEventListener != 'undefined') { 3 obj.addEventListener(type, fn, false); 4 } else { 5 //定义一个哈希表来存放事件对象 6 obj.events = obj.events || {}; 7 8 //将事件函数存放在事件对象的数组中 9 if (!obj.events[type]) { 10 obj.events[type] = []; 11 //将第一个事件函数存放在事件对象数组中的第一个位置上 12 if (obj['on' + type]) obj.events[type][0] = fn; 13 } else { 14 if (addEvent.equal(obj.events[type], fn)) return false; 15 } 16 //将后面的事件函数依次存放在事件对象数组中的其他位置 17 obj.events[type][addEvent.ID++] = fn; 18 //执行事件函数 19 obj['on' + type] = addEvent.exec; 20 } 21 } 22 23 //为每个事件分配一个计数器 24 addEvent.ID = 1; 25 26 //执行事件处理函数 27 addEvent.exec = function (e) { 28 var e = e || addEvent.fixEvent(window.event); 29 var es = this.events[e.type]; 30 for (var i in es) { 31 es[i].call(this, e); 32 } 33 }; 34 35 //同一个注册函数进行屏蔽 36 addEvent.equal = function (es, fn) { 37 for (var i in es) { 38 if (es[i] == fn) return true; 39 } 40 return false; 41 }; 42 43 //把IE常用的Event对象配对到W3C中去 44 addEvent.fixEvent = function (event) { 45 event.preventDefault = addEvent.fixEvent.preventDefault; 46 event.stopPropagation = addEvent.fixEvent.stopPropagation; 47 return event; 48 }; 49 50 51 //IE取消默认行为 52 addEvent.fixEvent.preventDefault = function () { 53 this.returnValue = false; 54 }; 55 56 //IE取消冒泡 57 addEvent.fixEvent.stopPropagation = function () { 58 this.cancelBubble = true; 59 }; 60 61 //跨浏览器删除事件函数 62 function removeEvent(obj, type, fn) { 63 if (typeof window.removeEventListener != 'undefined') { 64 obj.removeEventListener(type, fn, false); 65 } else { 66 for (var i in obj.events[type]) { 67 if (obj.events[type][i] === fn) { 68 delete obj.events[type][i] 69 } 70 } 71 } 72 }