zoukankan      html  css  js  c++  java
  • 事件绑定(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 }
  • 相关阅读:
    第15周作业
    迟到的第14周作业
    第13周作业集
    第11次作业--字符串处理
    找回感觉的练习
    第9次作业--接口及接口回调
    20194684 + 自动生成四则运算题第一版报告
    css的calc在less文件中计算有误问题
    react 细节整理
    js async属性
  • 原文地址:https://www.cnblogs.com/fengyuqing/p/javascript_addEvent_2.html
Copyright © 2011-2022 走看看