由于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. wpf 客户端【JDAgent桌面助手】开发详解(四) popup控件的win8.0的bug

    目录区域: 业余开发的wpf 客户端终于完工了..晒晒截图 wpf 客户端[JDAgent桌面助手]开发详解-开篇 wpf 客户端[JDAgent桌面助手]详解(一)主窗口 圆形菜单... wpf 客 ...

  2. HDU2825 Wireless Password(AC自动机+状压DP)

    题目问长度n至少包含k个咒语的字符串有多少个.也是比较入门的题.. dp[i][j][S]表示长度i(在自动机上转移k步)且后缀状态为自动机上第j个结点且当前包含咒语集合为S的方案数 dp[0][0] ...

  3. [iOS经典面试题]用变量a给出下面的定义

    用变量a给出下面的定义       a)一个整型数(An integer) b) 一个指向整型数的指针(A pointer to an integer)  c) 一个指向指针的的指针,它指向的指针是指 ...

  4. iOS开发项目之一 [ 项目流程]

    项目流程 *人员配置 *客户端(iOS工程师,Android工程师) *前端 h5 *后台人员(php,java,net) *提供接口(请求地址.请求参数,请求方式,接口文档) *UI UE * 效果 ...

  5. tomcat的安装

    这个安装过程很清晰,转载一下:http://jingyan.baidu.com/article/8065f87fcc0f182330249841.html

  6. ThinkPHP框架的部署

    1.将ThinkPHP框架的框架文件放到想要放置的地方,与创建的应用文件夹同级 2.vhost文件中设置虚拟目录 3.在hosts文件中配置 4.在应用目录中创建入口文件index.php 5.在入口 ...

  7. ZooKeeper应用场景介绍

    ZooKeeper是一个高可用的分布式数据管理与系统协调框架.维护着一个树形层次结构,书中的节点被称为znode.znode可以用来存储数据,并且有一个与之相关联的ACL(权限),znode不能大于1 ...

  8. Java实战equals()与hashCode()

    一.equals()方法详解 equals()方法在object类中定义如下: 代码 public boolean equals(Object obj) { return (this == obj); ...

  9. MySQL 数据库设计 笔记与总结(2)逻辑设计

    [实例演示 —— 实体之间的关系] [逻辑设计的工作] ① 将需求转化为数据库的逻辑模型 ② 通过 ER 图的形式对逻辑模型进行展示 ③ 同所选用的具体的 DBMS 系统无关 [名词解释] 候选码可以 ...

  10. linux使脚本在后台运行

    一.为什么要使程序在后台执行 我们计算的程序都是周期很长的,通常要几个小时甚至一个星期.我们用的环境是用putty远程连接到日本Linux服务器.所以使程序在后台跑有以下三个好处: 1:我们这边是否关 ...