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 }
  • 相关阅读:
    Linq之旅:Linq入门详解(Linq to Objects)【转】
    Shadow Map 原理和改进 【转】
    OSG 中文解决方案 【转】
    shadow mapping实现动态shadow实现记录 【转】
    RenderMonkey 练习 第六天 【OpenGL Water 水效】
    glsl水包含倒影的实现(rtt) 【转】
    Docker镜像仓库Harbor之搭建及配置
    docker登录没有配置https的harbor镜像仓库
    Git 清除远端已删除的分支
    单节点k8s的一个小例子 webapp+mysql
  • 原文地址:https://www.cnblogs.com/fengyuqing/p/javascript_addEvent_2.html
Copyright © 2011-2022 走看看