一般想到JS的兼容性问题的时候,首先会想到addEventListener与attachEvent这一对冤家,那么我们先来看看它们有什么兼容性问题

addEventListener与attachEvent区别:

一般我们在JS中添加事件,是这样子的

obj.onclick=method

这种绑定事件的方式,兼容主流浏览器,但如果一个元素上添加多次同一事件呢?

1. obj.onclick=method1;

2. obj.onclick=method2;

3. obj.onclick=method3;

如果这样写,那么只有最后绑定的事件,这里是method3会被执行,这个时候我们就不能用onclick这样的写法了,在IE中我们可以使用attachEvent方法

//1. object.attachEvent(event,function);

2. btn1Obj.attachEvent("onclick",method1);

3. btn1Obj.attachEvent("onclick",method2);

4. btn1Obj.attachEvent("onclick",method3);

火狐和其他浏览器都不支持,他们都支持W3C标准的addEventListener方法

//element.addEventListener(type,listener,useCapture);

btn1Obj.addEventListener("click",method1,false);

btn1Obj.addEventListener("click",method2,false);

btn1Obj.addEventListener("click",method3,false);

从上面两个例子可以看到,addEventListener与attachEvent有不同的。关于两者区别,几乎很多前端面试都会考察到,下面再回忆一下:
![](https://images0.cnblogs.com/blog2015/629726/201504/021112104202814.jpg) ### 解决作用域问题 由于attachEvent执行函数时,作用域是window,因此我们需要对传入的函数进行处理,让它可以指向正确的对象,这里面我们就用到了jquery中的一个方法$.proxy,不过更多的类库包括ES5都喜欢把这个函数叫bind,所以我这还是说bind,这个函数的作用是固定一个函数的调用对象,代码如下: ```javascript var slice = [].slice; /**
* 固定函数的`this`变量和若干参数
*
* @param {Function} fn 操作的目标函数
* @param {Object} context 函数的`this`变量
* @param {*} [args] 函数执行时附加到执行时函数前面的参数
* @return {Function} 固定了`this`变量和若干参数后的新函数对象
*/
function bind(fn, context, args) {
args = slice.call(arguments, 2);
return fn && function () {
return fn.apply(context, args.concat(slice.call(arguments)));
};
}

有了bind函数之后,我们就可以轻松的实现事件处理的兼容性了:

处理事件兼容

function addEvent(ele, type, fn) {
// 有addEventListener时优先使用
if(ele.addEventListener){
// 由于IE不支持捕获,所以所有的都用冒泡
ele.addEventListener(type, fn, false);
}else{
// 加一个on处理事件名不同的问题
// 使用bind让fn指向ele,以使attachEvent的行为和addEventListener一样
ele.attachEvent('on' + type, bind(fn, ele)); }
}

jQuery源代码学习笔记_bind的更多相关文章

  1. jQuery源代码学习笔记_工具函数_noop/error/now/trim

    jQuery源代码学习笔记_工具函数_noop/error/now/trim jquery提供了一系列的工具函数,用于支持其运行,今天主要分析noop/error/now/trim这4个函数: 1.n ...

  2. jQuery源代码学习笔记_01

    如何获取jQuery源代码 1.可以从GitHub上下载到没有合并和压缩的源代码 2.如果要查看兼容IE6-8的版本,请选择1.x-master分支 3.可以使用git clone也可以使用downl ...

  3. jQuery源代码学习笔记:jQuery.fn.init(selector,context,rootjQuery)代码具体解释

    3.1 源代码 init: function( selector, context, rootjQuery ) { var match, elem, ret, doc; // Handle $(&qu ...

  4. jQuery源代码学习笔记:构造jQuery对象

    2.1源代码结构: (function( window, undefined ) { var jQuery = (function() { // 构建jQuery对象 var jQuery = fun ...

  5. [Java] LinkedList / Queue - 源代码学习笔记

    简单地画了下 LinkedList 的继承关系,如下图.只是画了关注的部分,并不是完整的关系图.本博文涉及的是 Queue, Deque, LinkedList 的源代码阅读笔记.关于 List 接口 ...

  6. jQuery源代码学习_工具函数_type

    jquery源代码学习_工具函数_type jquery里面有一个很重要的工具函数,$.type函数用来判断类型,今天写这篇文章,是来回顾type函数的设计思想,深入理解. 首先来看一下最终结果: 上 ...

  7. jQuery源代码学习之九—jQuery事件模块

    jQuery事件系统并没有将事件坚挺函数直接绑定在DOM元素上,而是基于事件缓存模块来管理监听函数的. 二.jQuery事件模块的代码结构 //定义了一些正则 // // //jQuery事件对象 j ...

  8. jQuery源代码学习之八——jQuery属性操作模块

    一.jQuery属性模块整体介绍 jQuery的属性操作模块分四个部分:html属性操作,dom属性操作,类样式操作,和值操作. html属性操作(setAttribute/getAttribute) ...

  9. jQuery源代码学习之七—队列模块queue

    一.jQuery种的队列模块 jQuery的队列模块主要是为动画模块EFFECTS提供支持,(不过到现在为了支持动画队列的inprogress的出入队还是搞不太清楚),单独抽取出一个命名空间是为了使程 ...

随机推荐

  1. Java泛型读书笔记 (一)

    Java泛型 在Java SE7和之后的版本中,在new一个泛型类实例的时候,可以不传入类型参数,因为Java编译器可以通过赋给的变量类型声明推断出来,如下代码: ArrayList<Strin ...

  2. SQL SERVER 取本月上月日期

    select   dateadd(dd,-day(dateadd(month,-1,getdate()))+1,dateadd(month,-1,getdate()))     /*上个月一号*/ s ...

  3. c#操作word类,进行html和word文档的互相转换

    实例引用:http://www.7es.cn/Software_development/171.shtml using Microsoft.Office.Core;using Word = Micro ...

  4. MVC Controller传值到View的几种方式总结

    Controller中的代码如下 var bingo = new Web1.Models.Bingo() { Title = "测试", desc = "嘻嘻" ...

  5. 调试.NET CORE代码

    前言 core也用了很长一段时间了,发现很多小伙伴不知道如何调试core的代码. 可想而知,以前使用mvc的时候,不需要发布代码,直接iis地址指向项目源码,然后附加到进程w3wp.exe就可以调试了 ...

  6. GS70 使用 Linux 下面Oracle数据库时 设定 特定目录存储数据文件

    1. 创建目录 mkdir /cwdata 2. 修改目录属性 chown -R oracle:oinstall /cwdata chmod -R /cwdata 效果为: 创建数据库实例时的界面为: ...

  7. CSS再学

    css的注释 /*.......*/ 直接在html代码中写css <p style="color: rebeccapurple;font-size: 18px">Ha ...

  8. CentOS下安装配置SVN服务器并自动同步到web目录

    一.安装 yum install subversion测试是否安装成功 /usr/bin/svnserve --version如提示以下内容,说明已安装成功 svnserve,版本 1.6.11 (r ...

  9. tftp简单文件传输协议搭建

    TFTP 简单文件传输协议     安装     sudo apt-get install tftp  tftpd openbsd-inetd     需要tftp tftpd openbsd-ine ...

  10. Flashcache的 KEEP属性自动失效

    如果希望一个数据对象长期地缓存在flashcache中,则可以手动地将该数据对象的CELL_FLASH_CACHE属性设置为"keep". 其实需要说明的是,但不是数据对象的CEL ...