addEventListener和attachEvent以及element.onclick的区别

attachEvent是ie添加事件处理程序,接收两个参数,其中事件类型名称要加"on",

可以添加多个事件处理程序,按照添加顺序相反的顺序触发;

addEventListener是给非ie添加事件处理程序,接收三个参数,第一个是事件名,不需要加“on”,

第二个是绑定的函数,第三个参数是一个布尔值,是事件的方式,意思是是否使用useCatch方式,

如果是false,就使用传统的冒泡方式,如果为true,就在捕获阶段调用事件处理程序。

addEventListener可以添加多个事件处理程序,按照添加顺序触发

二者有个本质上的区别,attachEvent的事件处理程序会在全局作用域中运行,this等于window对象,

而addEventLinstener添加的事件处理程序是在其依附的元素的作用域中运行的,this等于绑定元素对象。

既然他们的this指向不同,那怎么才能实现相同的this指向呢?
如果想要实现this关键字指向相同的话,要用Function的apply或者call方法。示例代码如下:
 
function bind(el, fn, type){
        var _fn = function(){
                fn.apply(el, arguments);
        };
        window.addEventListener ? el.addEventListener(type, _fn, false) : el.attachEvent("on" + type, _fn);
}
即用el来代替_fn里的this。
 
 
el.onclick和addEventListener和attachEvent有什么区别呢?
本质的区别是el.onclick相当于在标签上写onclick,用addEventListener和attachEvent是通过DOM接口去绑定事件。
一个html文档的解析是有顺序的,先解析标签项,再解析DOM项,el.onclick事实上相当于写在标签上,
通过标签的onclick属性输入到文档,然后由文档解析成事件的。而后者,要在文档解析完成以后,
通过文档的dom接口去绑定的事件,虽然结果是一样的,都是click事件,但是过程是不同的。
 
通过这三种方式绑定的事件,怎么取消呢?
el.onclick:el.onclick=null;这样就可以取消绑定在el上的事件处理程序了。
通过addEventListener()添加的事件处理程序只能通过removeEventListener()来移除,并且移除时传入的参数与添加
处理程序时使用的参数相同。通过addEventListener()添加的匿名函数将无法移除。
通过attachEvent()添加的事件处理程序要通过detachEvent()来移除,其他的情况和addEventListener()一样。
 
 
如果都想在事件函数里面获取event对象,怎么获取呢?
这要分浏览器,IE和非IE的事件对象不同。兼容DOM的浏览器会将一个event对象传入到事件处理程序中,无论指定事件
处理程序时使用什么方法,都会传入event对象。
el.onclick=function(event){
  alert(event.type);           //"click"
};
el.addEventListener("click",function(event){
  alert(el.type);               //"click"
},false);
通过HTML标签属性指定的事件处理程序时,变量event中保存着event对象。
<input type="button" value="Click me" onclick="alert(event.type)"/>   //"click"
在IE中,要访问event对象有几种不同的方式:
通过el.onclick绑定的事件处理程序中,event对象作为window对象的一个属性存在。
el.onclick=function(){
  var event=window.event;
  alert(event.type);              //"click"
}
如果通过attachEvent()添加事件处理程序时,event对象作为参数被传入事件处理程序,
el.attachEvent("onclick",function(event){
  alert(event.type);                 //"click"
});
通过HTML标签属性指定的事件处理程序时,变量event中保存着event对象。这点和非IE一样。
综上,跨浏览器的事件对象获取方法是: return event?event:window.event;
 
 

addEventListener和attachEvent以及element.onclick的区别的更多相关文章

  1. Javascript中addEventListener和attachEvent的区别

    在利用javascript为DOM Element添加事件处理程序时,如果要想下兼容IE6,7时,就不得不考虑addEventListener与attachEvent的异同. 1.首先说下addEve ...

  2. addEventListener()及attachEvent()区别分析

    Javascript 的addEventListener()及attachEvent()区别分析 Mozilla中: addEventListener的使用方式: target.addEventLis ...

  3. Javascript添加事件的addEventListener()及attachEvent()区别分析,事件委托

    Mozilla中: addEventListener的使用方式: target.addEventListener(type, listener, useCapture); target: 文档节点.d ...

  4. Javascript 的addEventListener()及attachEvent()区别分析

    大家都知道事件的用法就是当某个事件(状况)被触发了之后就会去执行某个Function, 尤其是Javascript, 在当红AJAX的催化下, 了解Javascript的Event用法更加重要, 在这 ...

  5. 注册事件处理程序onclick和addEventListener、attachEvent

    一.设置HTML标签属性为事件处理程序(注意和下面的设置javascript对象属性为事件处理程序是不同的) 用于设置文档元素事件处理程序属性也能化成对应的HTML标签的属性.如果这样做,属性值应该是 ...

  6. addEventListener 与attachEvent

    第一:简单的通用方法(IE && FF) window.onload = function(){ var oDiv = document.getElementById("J_ ...

  7. addEventListener和attachEvent二者绑定的执行函数中的this不相同【转载】

    yuanwen http://www.jb51.net/article/32511.htm 写 addEventListener 和 attachEvent 区别的博文不少,不过大部分都把重点放置于前 ...

  8. Javascript 的addEventListener()及attachEvent()对比

    Mozilla中: addEventListener的使用方式: target.addEventListener(type, listener, useCapture); target: 文档节点.d ...

  9. addEventListener()、attachEvent()和removeEventListener()、detachEvent()的差别?

    addEventListener()和attachEvent()的差别? addEventListener:在HTML元素上绑定事件,FF.chrome.opera.safari及IE9浏览器以上的支 ...

随机推荐

  1. java io流之int数组数据的插入与取出

    java io流大家都非常熟悉吧,有时候假设用的不熟,对于数据的处理真的非常头疼,以下是对与int数组的处理. 以下是代码: public class Stream { private int a[] ...

  2. 怎样才能充分利用SQL索引

    原文:怎样才能充分利用SQL索引 背景:目前WEB的普及太快,很多网站都会因为大流量的数据而发生服务器习惯性死机,一个查询语句只能适用于一定的网络环境.没有优化的查询当遇上大数据量时就不适用了. 本文 ...

  3. Windows Phone 8.1 多媒体(2):视频

    原文:Windows Phone 8.1 多媒体(2):视频 Windows Phone 8.1 多媒体(1):相片 Windows Phone 8.1 多媒体(2):视频 Windows Phone ...

  4. The Swift Programming Language-官方教程精译Swift(4)字符串和字符

    String 是一个有序的字符集合,例如 "hello, world", "albatross".Swift 字符串通过 String 类型来表示,也可以表示为 ...

  5. java设计模式之七装饰器模式(Decorator)

    顾名思义,装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例,关系图如下: Source类是被装饰类,Decorator类是一个 ...

  6. Android 通过网络打开自己的APP(scheme)

    通过使用手机的浏览器(内部.第三方能够)访问网页,点击一个链接,开始实施自己的应用程序,和传输数据. 第一Mainifest面对文件启动Activity添加过滤器. <activity andr ...

  7. 还在等待漫长的iOS构建过程?来试试通过命令行的方式进行iOS应用快速构建和运行吧

    不必多言,Xcode慢得很是众所周知的了.更甚者是,我有时发觉自己太依赖于Cocoa Touch的自动完成功能了,这可是个天使和魔鬼的结合体! 故此我开始去寻觅一个替代的流程来通过命令行来实现我需要的 ...

  8. oracle获取字符串长度函数length()和hengthb()

    原文:oracle获取字符串长度函数length()和hengthb() lengthb(string)计算string所占的字节长度:返回字符串的长度,单位是字节 length(string)计算s ...

  9. android数据库升级的措辞

    在基类table增加upgrade操作: public abstract class DbBaseTable { private static final String TAG = "DbB ...

  10. Objective C多态

    面向对象的封装的三个基本特征是.继承和多态. 包是一组简单的数据结构和定义相关的操作在上面的其合并成一个类,继承1种亲子关系,子类能够拥有父类定的成员变量.属性以及方法. 多态就是指父类中定义的成员变 ...