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 相关文章推荐
JavaScript 调试器简介
Feb 21 Javascript
js DOM 元素ID就是全局变量
Sep 20 Javascript
点击标签切换和自动切换DIV选项卡
Aug 10 Javascript
一个实用的图片切换支持点击切换和自动轮播
Sep 09 Javascript
jquery+ajax请求且带返回值的代码
Aug 12 Javascript
js实现网页图片延时加载 提升网页打开速度
Jan 26 Javascript
ionic环境配置及问题详解
Jun 27 Javascript
jQuery使用动画队列自定义动画操作示例
Jun 16 jQuery
vue实现配置全局访问路径头(axios)
Nov 01 Javascript
js Math数学简单使用操作示例
Mar 13 Javascript
Vue实现图书管理小案例
Dec 03 Vue.js
Vue实现动态查询规则生成组件
May 27 Vue.js
浅谈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
PHILIPS L4X25T电路分析和打理
2021/03/02 无线电
PHP判断文件是否存在、是否可读、目录是否存在的代码
2012/10/03 PHP
PHP+MYSQL实现用户的增删改查
2015/03/24 PHP
PHP中set error handler函数用法小结
2015/11/11 PHP
php用xpath解析html的代码实例讲解
2019/02/14 PHP
原生PHP实现导出csv格式Excel文件的方法示例【附源码下载】
2019/03/07 PHP
php高性能日志系统 seaslog 的安装与使用方法分析
2020/02/29 PHP
jquery ui dialog实现弹窗特效的思路及代码
2013/08/03 Javascript
javascript中sort()的用法实例分析
2015/01/30 Javascript
javascript动态添加checkbox复选框的方法
2015/12/23 Javascript
jQuery的extend方法【三种】
2016/12/14 Javascript
jquery实现图片上传前本地预览
2017/04/28 jQuery
JS和jQuery通过this获取html标签中的属性值(实例代码)
2017/09/11 jQuery
jQuery实现的简单图片轮播效果完整示例
2018/02/08 jQuery
Vue2.0系列之过滤器的使用
2018/03/01 Javascript
Redux实现组合计数器的示例代码
2018/07/04 Javascript
JS寄快递地址智能解析的实现代码
2020/07/16 Javascript
vue中el-input绑定键盘按键(按键修饰符)
2020/07/22 Javascript
python多线程http下载实现示例
2013/12/30 Python
在Python中使用SQLite的简单教程
2015/04/29 Python
Python使用回溯法子集树模板解决爬楼梯问题示例
2017/09/08 Python
Python使用Tkinter实现机器人走迷宫
2018/01/22 Python
Pandas透视表(pivot_table)详解
2019/07/22 Python
Django 用户认证组件使用详解
2019/07/23 Python
python定时任务 sched模块用法实例
2019/11/04 Python
Python标准库itertools的使用方法
2020/01/17 Python
Python爬虫库requests获取响应内容、响应状态码、响应头
2020/01/25 Python
python opencv实现图片缺陷检测(讲解直方图以及相关系数对比法)
2020/04/07 Python
Tensorflow全局设置可见GPU编号操作
2020/06/30 Python
纽约JewelryAffairs珠宝店:精细金银时尚首饰
2017/02/05 全球购物
土耳其国际性时尚购物网站:Modanisa
2018/01/19 全球购物
圣诞树世界:Christmas Tree World
2019/12/10 全球购物
2014离婚协议书范文
2014/09/10 职场文书
上班迟到检讨书范文300字
2014/11/02 职场文书
在职证明范本
2015/06/15 职场文书
蓝牙耳机怎么连接电脑win11? Win11蓝牙耳机连接电脑的技巧
2023/01/09 数码科技