由于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. HDU4812 D Tree(树的点分治)

    题目大概说给一棵有点权的树,输出字典序最小的点对,使这两点间路径上点权的乘积模1000003的结果为k. 树的点分治搞了.因为是点权过根的两条路径的LCA会被重复统计,而注意到1000003是质数,所 ...

  2. LightOJ1122 Digit Count(DP)

    dp[i][j]表示长度i末尾为S[j]的方案数 dp[1][0...m-1]=1 dp[i][j]=∑dp[i-1][k] (|S[k]-S[j]|<=2) #include<cstdi ...

  3. u盘文件系统故障的修复方法

    比如U盘挂载的文件系统是/dev/sda1,且文件系统有故障(FAT: Filesystem error) 修复U盘文件系统故障 sudo dosfsck -v -a /dev/sda1

  4. mac 下的 top 命令

    mac 下的 top 命令 文章目录 以前只是在 linux 机器上使用 top 命令.常用的快键键是: p 键 - 按 cpu 使用率排序 m 键 - 按内存使用量排序 这 2 个快捷键在 mac ...

  5. 8.20 css样式表:样式分类,选择器。样式属性,

    样式表分类: 1.内联样式表, 和html联合显示,例:<p style="font-size:14px;">内联样式表</p> 2.内嵌样式表 作为一个独 ...

  6. 冒泡排序:一百以内十个随机数放入数组排序并打印<

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. 新浪SAE数据库连接demo和说明

    <?php $con = mysql_connect(SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS); // ...

  8. 【ZZ】 DShader之位移贴图(Displacement Mapping)

    http://www.myexception.cn/other/1397638.html DShader之位移贴图(Displacement Mapping) www.MyException.Cn   ...

  9. Apache Spark源码走读之21 -- WEB UI和Metrics初始化及数据更新过程分析

    欢迎转载,转载请注明出处,徽沪一郎. 概要 WEB UI和Metrics子系统为外部观察监测Spark内部运行情况提供了必要的窗口,本文将简略的过一下其内部代码实现. WEB UI 先上图感受一下sp ...

  10. PHP json_decode 函数解析 json 结果为 NULL 的解决方法

    在做网站 CMS 模块时,对于模块内容 content 字段,保存的是 json 格式的字符串,所以在后台进行模块内容的编辑操作 ( 取出保存的数据 ) 时,需要用到 json_decode() 函数 ...