javascript中传统事件与现代事件


Posted in Javascript onJune 23, 2015

大家都知道,IE中的现代事件绑定(attachEvent)与W3C标准的(addEventListener)相比存在很多问题,

例如:内存泄漏,重复添加事件并触发的时候是倒叙执行等。

下面是用传统事件的方法来处理封装事件的绑定:

addEvent.ID = 1;    // 事件计数器
  function addEvent(obj, type, fn){
    if(obj.addEventListener){
      obj.addEventListener(type, fn, false);
    } else {    // IE
      // 判断对象是否存在,保证只有一个对象,否则每执行一次,会创建一个事件对象
      // 以键值对的形式储存类型与函数的一个数组,=======将事件对象数组挂载到obj对象是为

了方便事件的删除
      if( !obj.events){
        // 相当于结构为:obj.events : {click:[fn1,fn2], mouserover:[fn1], ...}
        obj.events = {};
      }
      var flag = false;
      // 存储事件对象
      if( !obj.events[type]){
        // 类型数据储存挨个函数
        obj.events[type] = [];
        // 该类型的第一次事件类型及函数储存到该类型数组中的第一位
        obj.events[type][0] = fn;
      } else {
        var eventfn = obj.events[type];
        // 循环遍历该类型对象查询该事件是否重复,如果重复flag为true,并return返回
        for(var i in eventfn){
          if(eventfn[i] == fn ){
            flag = true;
            return;
          }
        }
        // 判断该事件是否重复,重复的话就不进行事件的函数的存储,否则储存该事件并执行
        if( !flag ){
          // 当该类型已经存在了,将为该事件进行累计时间类型函数存储,最后循环执行
          eventfn[addEvent.ID++] = fn;
        }

      }

      // 事件函数 类型数组 函数遍历调用
      obj["on"+type] = function(){
        var event = window.event;  // 事件对象的储存

        // 在事件对象后添加函数,当执行的时候调用,并阻止默认行为的发生,与W3C标准同步
        event.preventDefault = function(){
          this.returnValue = false;
        };
        // 在事件对象后面添加函数,一个尾巴函数,停止冒泡。
        event.stopPropagation = function(){
          this.cancelBubble = true;
        };

        // 循环遍历执行类型储存的多个函数
        var evfn = obj.events[type];
        for(var i in evfn){
          // 顺序执行该类型的事件函数,解决了传统事件的覆盖问题和现代事件绑定的逆序触发

事件的问题
          evfn[i].call(this, event);   // 将执行函数放置在该对象的环境下执行,并传递一个事件对

象给函数回调使用
        }
      }

    }
  }


  function removeEvent(obj, type, fn){
    if(obj.removeEventListener){
      obj.removeEventListener(type, fn, false);
    } else {
      // 循环遍历该对象下该类型的事件函数是否函数该函数,如果有就将该事件函数删除
      var evefn = obj.events[type];
      for(var i in evefn){
        if(evefn[i] == fn){
          // delete evefn[i]; 该方法也可以删除该数组的该项,但是会保留该位置当访问的时候值

为undefined
          evefn.splice( i, 1); // 从第i的位置删除1位,
        }
      }

    }
  }

以上所述就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
Array.prototype.slice.apply的使用方法
Mar 17 Javascript
js获取单元格自定义属性值的代码(IE/Firefox)
Apr 05 Javascript
JqGrid web打印实现代码
May 31 Javascript
Ubuntu 11.10 安装Node.js的方法
Nov 30 Javascript
intro.js 页面引导简单用法 分享
Aug 06 Javascript
ECMAScript 5严格模式(Strict Mode)介绍
Mar 02 Javascript
详解js中构造流程图的核心技术JsPlumb
Dec 08 Javascript
全面解析JavaScript中“&&”和“||”操作符(总结篇)
Jul 18 Javascript
node.js中 stream使用教程
Aug 28 Javascript
Bootstrap优化站点资源、响应式图片、传送带使用详解3
Oct 14 Javascript
使用Node.js实现ORM的一种思路详解(图文)
Oct 24 Javascript
vue动态删除从数据库倒入列表的某一条方法
Sep 29 Javascript
浅谈jquery中delegate()与live()
Jun 22 #Javascript
jquery 中ajax执行的优先级
Jun 22 #Javascript
jquery中ready()函数执行的时机和window的load事件比较
Jun 22 #Javascript
jquery中toggle函数交替使用问题
Jun 22 #Javascript
浅谈js 闭包引起的内存泄露问题
Jun 22 #Javascript
js闭包所用的场合以及优缺点分析
Jun 22 #Javascript
JavaScript创建闭包的两种方式的优劣与区别分析
Jun 22 #Javascript
You might like
TP5框架实现签到功能的方法分析
2020/04/05 PHP
javascript 页面只自动刷新一次
2009/07/10 Javascript
jQuery 树形结构的选择器
2010/02/15 Javascript
jQuery ajax cache缓存问题
2010/07/01 Javascript
在Javascript里访问SharePoint列表数据的实现方法
2011/05/22 Javascript
javascript完美拖拽的实现方法
2013/09/29 Javascript
node.js实现多图片上传实例
2014/06/03 Javascript
jQuery的ready方法详解
2014/11/27 Javascript
Jquery幻灯片特效代码分享--打开页面随机选择切换方式(3)
2015/08/15 Javascript
jQuery增加与删除table列的方法
2016/03/01 Javascript
js HTML5多媒体影音播放
2016/10/17 Javascript
Bootstrap风格的zTree右键菜单
2017/02/17 Javascript
Vue0.1的过滤代码如何添加到Vue2.0直接使用
2017/08/23 Javascript
详解vue-cli 本地开发mock数据使用方法
2018/05/29 Javascript
详解node字体压缩插件font-spider的用法
2018/09/28 Javascript
jQuery实现的鼠标拖动画矩形框示例【可兼容IE8】
2019/05/17 jQuery
基于JS正则表达式实现模板数据动态渲染(实现思路详解)
2020/03/07 Javascript
如何解决jQuery 和其他JS库的冲突
2020/06/22 jQuery
vue设置全局访问接口API地址操作
2020/08/14 Javascript
javascript实现简单页面倒计时
2021/03/02 Javascript
测试、预发布后用python检测网页是否有日常链接
2014/06/03 Python
Python简单操作sqlite3的方法示例
2017/03/22 Python
python+matplotlib实现礼盒柱状图实例代码
2018/01/16 Python
Flask框架各种常见装饰器示例
2018/07/17 Python
python如何获取apk的packagename和activity
2020/01/10 Python
python实现连连看游戏
2020/02/14 Python
python3跳出一个循环的实例操作
2020/08/18 Python
使用css3实现的windows8开机加载动画
2014/12/09 HTML / CSS
使用html5实现表格实现标题合并的实例代码
2019/05/13 HTML / CSS
Java中采用什么结构来捕获、处理异常?各子句的顺序、功能如何
2013/10/07 面试题
经贸日语毕业生自荐信
2013/11/03 职场文书
母亲节演讲稿范文
2014/01/02 职场文书
3.15国际消费者权益日主题活动活动总结
2014/03/16 职场文书
先进事迹材料怎么写
2014/12/30 职场文书
2015学校年度工作总结
2015/05/11 职场文书
Redis实战之Lettuce的使用技巧详解
2022/12/24 Redis