事件绑定(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 }
原文地址:https://www.cnblogs.com/fengyuqing/p/javascript_addEvent_2.html