由于ie中绑定事件的bug,所以产生了用原生的实践操作来模拟事件绑定的方法,跟着李炎恢学的一招。

function addEvent(obj, type, fn){

  if(obj.addEventListener){

    obj.addEventListener(type, fn, false);

  }else{

  if(!obj.events) obj.events = {};

    if(!obj.events[type]) {

      obj.events[type] = [];

      if(obj['on'+ type]) obj.events[type][0] = fn;    //这一步的时候  其实我看到的视频和文档上李炎恢大神并没有说清楚为什么要加个判断,仅仅说了一句可以减少一次绑定,没说为什么。多看几遍之后发现,是因为如果不加判断,会在页面加载之后,还不需要出发事件呢,他就绑定了第一个函数。所以需要确认,只有在我们需要绑定函数的时候,才能将函数赋值到数组的第一位上。

    }else{

      if(addEvent.equal(obj.events[type], fn)) return false;  //对所有已经绑定的同类型事件进行循环,如果当前需要绑定的事件,已经绑定过一次,则跳出事件绑定。

    }

    obj.events[type][addEvent.ID++] = fn;  //非初次绑定事件的累加

    obj['on' + type] = addEvent.exec;  //执行所有已经绑定的事件

}

}

addEvent.ID = 1;

addEvent.equal = function(es, fn){      //遍历保存的事件,如果有与新增的绑定事件相同的事件,则新增的事件不予绑定

  for(var i in es){

    if(es[i] == fn) return true;

  }

  return false;

}

addEvent.exec = function(e){

  var e = e || addEvent.fixEvent(window.event);

  var es = this.events[e.type];      //这里有个小坑,由于上面主体函数参数名也有一个type,所以很容易误解为两个type是一样的,其实并不是。参数type仅仅是一个参数名称,没有具体的意义,可以改成任何参数名称,但是这里的type是事件对象e的一个属性,可以获取当前出发的究竟是什么事件类型。

  for (var i in es){

    es[i].call(this, e);          //使用call,主要目的是为了传递参数this和e  

  }

}

addEvent.fixEvent = function(ev){

  ev.preventDefault = function(){

    this.returnValue = false;

  }

  ev.stopPropagation = function(){

    this.cancelBubble = true;

  }

  ev.target = window.event.srcElement;

  return ev;

}

巩固复习一遍。

学习之js绑定事件的更多相关文章

  1. js绑定事件和解绑事件

    在js中绑定多个事件用到的是两个方法:attachEvent和addEventListener,但是这两个方法又存在差异性 attachEvent方法  只支持IE678,不兼容其他浏览器 addEv ...

  2. js绑定事件方法:addEventListener的兼容问题

    js的事件绑定方法中,ie只支持attachEvent,而FF和Chrome只支持addEventListener;严格来说:addEventListener只有IE9以上版本的IE浏览器上能够兼容, ...

  3. js绑定事件方法:addEventListener与attachEvent的不同浏览器的兼容性写法

    js的事件绑定方法中,ie仅仅支持attachEvent,而FF和Chrome仅仅支持addEventListener,所以就必须为这两个方法做兼容处理,原理是先推断attachEvent仅仅否为真( ...

  4. js绑定事件代理的坑

    js通过事件代理的方式绑定跳转事件,我这里的逻辑是把click事件绑定在最外层container上面,如果e.target包含我已经写好的class,则执行跳转逻辑.但是这种方式好像只能是在点击的元素 ...

  5. [jquery]高级篇--js绑定事件

    参考:  http://www.cnblogs.com/leejersey/p/3545372.html jQuery on()方法是官方推荐的绑定事件的一个方法.$(selector).on(eve ...

  6. 5月23日笔记-js绑定事件、解绑事件、复合事件

    each() $("p").each(function(i,ele){ //alert(ele.innerHTML); alert($("p:eq("+i+&q ...

  7. 原生 JS 绑定事件 移除事件

    监听事件的绑定与移除主要是addEventListener和removeEventListener的运用. addEventListener语法 element.addEventListener(ty ...

  8. JS基础学习四:绑定事件

    添加事件 IE: attachEvent Other: addEventListener var button = document.getElementById("buttonId&quo ...

  9. JS绑定事件和移除事件的处理方法

    addEventListener()与removeEventListener()用于处理指定和删除事件处理程序操作.所有的DOM节点中都包含这两种方法,并且它们都接受3个参数:要处理的事件名.作为事件 ...

随机推荐

  1. HealthKit开发教程之HealthKit的主要类型数据

    HealthKit开发教程之HealthKit的主要类型数据 在HealthKit中,我们将最常用到的数据称之为主要数据.主要数据基本上有三种:长度类型的数据.质量类型的数据.能量类型的数据.本节将主 ...

  2. sssssssss

    构造函数new A 和new A()的区别,都是A类的实例化,后者可以向构造函数传参数. a=f(),指向window a=new f()指向当前函数的实例. Return b和return b()区 ...

  3. Linux下设置memcached访问IP

    在虚拟机上装了memcached,本地访问可以,但从其它机器连这台机器的memcached应用总是报连接失败.防火墙的端口都是打开的.Google了才知道原来需要修改memcached的配置文件,将默 ...

  4. Codeforces Round #329 (Div. 2)

    推迟了15分钟开始,B卡住不会,最后弃疗,rating只涨一分...   水(暴力枚举) A - 2Char /******************************************** ...

  5. 简单几何(线段相交) POJ 2653 Pick-up sticks

    题目传送门 题意:就是小时候玩的一种游戏,问有多少线段盖在最上面 分析:简单线段相交,队列维护当前最上的线段 /******************************************** ...

  6. 【翻译】使用Knockout, Web API 和 ASP.Net Web Forms 进行简单数据绑定

    原文地址:http://www.dotnetjalps.com/2013/05/Simple-data-binding-with-Knockout-Web-API-and-ASP-Net-Web-Fo ...

  7. PHP中常见的页面跳转方法

    转载自冠威博客 [ http://www.guanwei.org/ ]本文链接地址:http://www.guanwei.org/post/PHPnotes/04/php-redirect-metho ...

  8. 修改setInterval作用域

    Hello,今天和大家分享如何修改setInterval作用域. 0.引子 最近在做一个项目的时候需要开发一个图片轮播显示的组件,在实现过程中遇到了关于setInterval作用域的问题. Slide ...

  9. TYVJ P1056 能量项链 Label:环状区间DP

    做题记录:2016-08-16 20:05:27 背景 NOIP2006 提高组 第一道 描述     在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头 ...

  10. Graph database_neo4j 底层存储结构分析(6)

    3.6  Node 数据存储 neo4j 中, Node 的存储是由 NodeStore 和 ArrayPropertyStore 2中类型配合来完成的. node 的label 内容是存在Array ...