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 相关文章推荐
关于flash遮盖div浮动层的解决方法
Jul 17 Javascript
js根据鼠标移动速度背景图片自动旋转的方法
Feb 28 Javascript
Javascript aop(面向切面编程)之around(环绕)分析
May 01 Javascript
jQuery代码实现发展历程时间轴特效
Jul 30 Javascript
理解js回收机制通俗易懂版
Feb 29 Javascript
实例讲解jQuery EasyUI tree中state属性慎用
Apr 01 Javascript
简单实现js间歇或无缝滚动效果
Jun 29 Javascript
js HTML5多图片上传及预览实例解析(不含前端的文件分割)
Aug 26 Javascript
使用JSON作为函数的参数的优缺点
Oct 27 Javascript
解析利用javascript如何判断一个数为素数
Dec 08 Javascript
详解如何在Vue里建立长按指令
Aug 20 Javascript
浅谈Vue页面级缓存解决方案feb-alive(上)
Apr 14 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
初学PHP的朋友 经常问的一些问题。不断更新
2011/08/11 PHP
php使用函数pathinfo()、parse_url()和basename()解析URL
2016/11/25 PHP
laravel excel 上传文件保存到本地服务器功能
2019/11/14 PHP
php连接mysql之mysql_connect()与mysqli_connect()的区别
2020/07/19 PHP
利用404错误页面实现UrlRewrite的实现代码
2008/08/20 Javascript
html数组字符串拼接的最快方法
2009/09/16 Javascript
javascript(jquery)利用函数修改全局变量的代码
2009/11/02 Javascript
EXT中xtype的含义分析
2010/01/07 Javascript
Prototype源码浅析 Enumerable部分(二)
2012/01/18 Javascript
使用jQuery UI的tooltip函数修饰title属性的气泡悬浮框
2013/06/24 Javascript
jQuery定义背景动态切换效果的方法
2015/03/23 Javascript
Boostrap模态窗口的学习小结
2016/03/28 Javascript
详细探究ES6之Proxy代理
2016/07/22 Javascript
jQuery监听文件上传实现进度条效果的方法
2016/10/16 Javascript
js获取浏览器高度 窗口高度 元素尺寸 偏移属性的方法
2016/11/21 Javascript
jQuery纵向导航菜单效果实现方法
2016/12/19 Javascript
Angular-Ui-Router+ocLazyLoad动态加载脚本示例
2017/03/02 Javascript
Angular 4.0学习教程之架构详解
2017/09/12 Javascript
ionic grid(栅格)九宫格制作详解
2018/06/30 Javascript
微信小程序自定义底部弹出框功能
2020/11/18 Javascript
[03:06]3分钟带你回顾DOTA2完美盛典&完美大师赛
2017/12/06 DOTA
Python使用chardet判断字符编码
2015/05/09 Python
Python实现对excel文件列表值进行统计的方法
2015/07/25 Python
python简单实现获取当前时间
2016/08/27 Python
python使用magic模块进行文件类型识别方法
2018/12/08 Python
python基础教程之while循环
2019/08/14 Python
HTML 5.1来了 9月份正式发布 更新内容预览
2016/04/26 HTML / CSS
小学运动会班级口号
2014/06/09 职场文书
安全施工责任书
2014/08/25 职场文书
五五普法心得体会
2014/09/04 职场文书
冰峪沟导游词
2015/02/09 职场文书
小学入学感言
2015/08/01 职场文书
师德师风培训感言
2015/08/03 职场文书
学校2016年九九重阳节活动总结
2016/04/01 职场文书
三好学生竞选稿范文
2019/08/21 职场文书
正确使用MySQL INSERT INTO语句
2021/05/26 MySQL