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 相关文章推荐
单独使用CKFinder选择图片的方法
Aug 21 Javascript
js日期相关函数总结分享
Oct 15 Javascript
浅谈JavaScript 的执行顺序
Aug 07 Javascript
jQuery实现的超酷苹果风格图标滑出菜单效果代码
Sep 16 Javascript
深入理解JavaScript程序中内存泄漏
Mar 17 Javascript
如何在Angular.JS中接收并下载PDF
Nov 26 Javascript
AngularJS实现表单验证功能详解
Oct 12 Javascript
js实现会跳动的日历效果(完整实例)
Oct 18 Javascript
JavaScript中的E-mail 地址格式验证
Mar 28 Javascript
vue多层嵌套路由实例分析
Mar 19 Javascript
javascript实现的时间格式加8小时功能示例
Jun 13 Javascript
Node中对非阻塞I/O、事件循环的知识点总结
Jan 05 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
星际争霸任务指南——人族
2020/03/04 星际争霸
我的论坛源代码(六)
2006/10/09 PHP
php从数据库查询结果生成树形列表的方法
2015/04/17 PHP
在Linux系统的服务器上隐藏PHP版本号的方法
2015/06/06 PHP
如何用PHP来实现一个动态Web服务器
2015/07/29 PHP
PHP运行模式汇总
2016/11/06 PHP
PHP设计模式之单例模式原理与实现方法分析
2018/04/25 PHP
利用JQuery为搜索栏增加tag提示
2009/06/22 Javascript
使用JS读秒使用示例
2013/09/21 Javascript
Javascript中With语句用法实例
2015/05/14 Javascript
jquery验证手机号是否正确实例讲解
2015/11/17 Javascript
bootstrap如何让dropdown menu按钮式下拉框长度一致
2017/04/10 Javascript
vue3.0 CLI - 1 - npm 安装与初始化的入门教程
2018/09/14 Javascript
vue3.0中的双向数据绑定方法及优缺点
2019/08/01 Javascript
[02:38]DOTA2英雄基础教程 噬魂鬼
2014/01/03 DOTA
[01:02]DOTA2辉夜杯决赛日 CDEC.Y对阵VG赛前花絮
2015/12/27 DOTA
python list排序的两种方法及实例讲解
2017/03/20 Python
对python 多线程中的守护线程与join的用法详解
2019/02/18 Python
python 进程的几种创建方式详解
2019/08/29 Python
python实现全排列代码(回溯、深度优先搜索)
2020/02/26 Python
六种酷炫Python运行进度条效果的实现代码
2020/07/17 Python
python smtplib发送多个email联系人的实现
2020/10/09 Python
CSS3中Transition动画属性用法详解
2016/07/04 HTML / CSS
canvas进阶之如何画出平滑的曲线
2018/10/15 HTML / CSS
澳大利亚领先的优质葡萄酒拍卖会:Langton’s Fine Wines
2019/03/24 全球购物
如何清空Session
2015/02/23 面试题
学生会主席就职演讲稿
2014/01/14 职场文书
秘书英文求职信范文
2014/01/31 职场文书
竞选大队干部演讲稿
2014/09/11 职场文书
群众路线教育实践活动总结
2014/10/30 职场文书
实习推荐信格式模板
2015/03/27 职场文书
建筑工地资料员岗位职责
2015/04/13 职场文书
2015年人事科工作总结
2015/04/28 职场文书
总经理致辞
2015/07/29 职场文书
MySQL如何解决幻读问题
2021/08/07 MySQL
《总之就是很可爱》新作短篇动画《总之就是很可爱~制服~》将于2022年夏天播出
2022/04/07 日漫