1.attachEvent与addEventListener的区别

  • 支持的浏览器不同。attachEvent在IE9以下的版本中受到支持。其它的都支持addEventListener
  • 参数不同。addEventListener第三个参数可以指定是否捕获,而attachEvent不支持捕获。
  • 事件名不同。attachEvent第一个参数事件名前要加on,比如el.attachEvent('onclick', handleClick)。
  • this不同。本文的将重点解释

2.attachEvent方式的事件绑定

attachEventthis总是Window。例如:

el.attachEvent('onclick', function(){
alert(this);
});

执行后会弹出对话框:[object Window]

3.addEventListener方式的事件绑定

addEventListenerthis总是当前正在处理事件的那个DOM对象。 DOM Level 2 Event Model中提到,事件处理包括捕获阶段、目标阶段和冒泡阶段 。如下图:

事件当前正在流过哪个元素,this便指向哪个元素。比如对于两级的DOM:

<div id="l1">
<div id="l2"></div>
</div>
<script type="text/javascript">
var l1 = document.getElementById('l1'),
l2 = document.getElementById('l2'); l1.addEventListener('click', function () {
console.log('l1 capture', this);
}, true);
l1.addEventListener('click', function () {
console.log('l1 bubbling', this);
});
l2.addEventListener('click', function () {
console.log('l2 target', this);
});
</script>

点击div#l2后控制台输出为:

l1 capture <div id=​"l1">​…​</div>​
l2 target <div id=​"l2">​</div>​
l1 bubbling <div id=​"l1">​…​</div>​

4.纠正attachevent

Event.addEvent = function(target,eventType,handle){
target.attachEvent('on'+eventType,function(){
handle.call(currentTarget,arguments);//改变this指向
});
}

这里使用了currentTarget,我们再来顺着分析一下target与currentTarget。

addEventListener的事件处理函数中this不一定指向事实上被点击的元素, 但事件处理函数的参数Event对象提供了targetcurrentTarget属性来区分这当前对象与目标对象。 我们可以把它们都全部输出:

l1.addEventListener('click', function (e) {
console.log('l1 capture', this, e.currentTarget, e.target);
}, true);
l2.addEventListener('click', function (e) {
console.log('l2 target', this, e.currentTarget, e.target);
});
l2.addEventListener('click', function (e) {
console.log('l2 target, invalid capture', this, e.currentTarget, e.target);
}, true);

结果是:

l1 capture  <div id=​"l1">​…​</div>​  <div id=​"l1">​…​</div>​  <div id=​"l2">​</div>​
l2 target <div id=​"l2">​</div>​ <div id=​"l2">​</div>​ <div id=​"l2">​</div>​
l1 bubbling <div id=​"l1">​…​</div>​ <div id=​"l1">​…​</div>​ <div id=​"l2">​</div>​

可见currentTarget总是和this相同,而target指向事实上被点击的目标DOM对象。

5.补充:onclick在HTML和脚本中this指向的区别

脚本设置onclick方式的事件绑定

在javascript中设置DOM对象的onclick属性,this总是指向被设置的DOM元素。例如:

document
.getElementById('l1')
.onclick = function(){
console.log(this);
};

点击div#l1后控制台输出为:

<div id="l1">...</div>

HTML中设置onclick方式的事件绑定

在HTML中设置onclick属性相当于让Window来调用该处理函数,于是this总是Window。例如:

<div onclick="clickHandler()"></div>
<script>
function clickHandler(){
console.log(this);
}
</script>

点击这个div后的控制台输出为:

Window {top: Window, location: Location, document: document, window: Window, external: Object…}

attachEvent和addEventListener区别总结的更多相关文章

  1. attachEvent和addEventListener区别

    一般来说,可以直接封装成这种形式: var addEvent = function(element,type,handler){ if(element.addEventListener){ //DOM ...

  2. attachEvent与addEventListener的区别 真实例子

    转自:https://www.cnblogs.com/Rosefxd/p/4921330.html 近日遇到attachEvent与addEventListener两个事件,哟,果断研究一下~~ 先普 ...

  3. (转载)JS事件监听 JS:attachEvent和addEventListener使用方法

    (转载)http://www.chhua.com/web-note146 attachEvent和addEventListener使用方法 Js代码 <html> <head> ...

  4. JS事件监听 JS:attachEvent和addEventListener 使用方法

    attachEvent与addEventListener区别适应的浏览器版本不同,同时在使用的过程中要注意attachEvent方法          按钮onclickaddEventListene ...

  5. attachEvent和addEventListener

    attachEvent和addEventListener在前端开发过程中经常性的使用,他们都可以用来绑定脚本事件,取代在html中写obj.onclick=method. 相同点: 它们都是dom对象 ...

  6. js中添加事件 attachEvent 与 addEventListener

    给元素添加事件时,使用js进行实现时产生了疑惑,有关事件浏览器兼容的问题,在此记录如下. <!DOCTYPE html> <html> <head> <met ...

  7. attachEvent与addEventlistener兼容性

    关于原生事件绑定中attachEvent与addEventlistener中兼容性以及attachEvent函数中this指代window有关问题   请点击下面回答中的"采纳为答案&quo ...

  8. JavaScript中的attachEvent和addEventListener

    attachEvent和addEventListener在前端开发过程中经常性的使用,他们都可以用来绑定脚本事件,取代在html中写obj.onclick=method. 相同点: 它们都是dom对象 ...

  9. attachEvent 与 addEventListener 的监听

    说到 attachEvent 与 addEventListener 的事件必然会提到  浏览器的判断,因为attachEvent只适用于于IE 先来看看常用的浏览器的判断 //判断浏览器类型 if(n ...

随机推荐

  1. 《Forward团队-爬虫豆瓣top250项目-代码设计规范》

    成员:马壮,李志宇,刘子轩,年光宇,邢云淇,张良 1.缩进采用一个Tab键 2.大括号:如: if (条件){ 语句: } 3.分行:不把多条语句放在同一行 4.变量命名:统一用英文 5.注释:注释前 ...

  2. (KMP 扩展)Clairewd’s message -- hdu -- 4300

    http://acm.hdu.edu.cn/showproblem.php?pid=4300 Clairewd’s message Time Limit: 2000/1000 MS (Java/Oth ...

  3. hdu5883 The Best Path 2016-09-21 21:31 92人阅读 评论(0) 收藏

    The Best Path Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) To ...

  4. OKHttp概览

    1,整体思路 从使用方法出发,首先是怎么使用,其次是我们使用的功能在内部是如何实现的,实现方案上有什么技巧,有什么范式.全文基本上是对 OkHttp 源码的一个分析与导读,非常建议大家下载 OkHtt ...

  5. underscore objects

    1._.keys():获取对象的属性名,不包含原型链 _.keys = nativeKeys || function(obj) { if (obj !== Object(obj)) throw new ...

  6. REST格式

    首先要明确一点:REST 实际上只是一种设计风格,它并不是标准.(所以你可以看到网上一大堆的各种最佳实践,设计指南,但是没有人说设计标准).aisuhua/restful-api-design-ref ...

  7. 一个CSV文件解析类

    import java.io.BufferedReader; import java.io.FileReader; import java.util.ArrayList; import java.ut ...

  8. Java程序性能定位工具-火焰图

    Java程序性能定位工具-火焰图 前言 Java火焰图是一种新的查看CPU利用率方式.今天就带大家一起使用来自Google大神的工具来生成火焰图.火焰图非常的直观,问题一目了然,希望有一天它能成为JA ...

  9. 【转】【译】【Win10】在你的程序标题栏中显示后退按钮

    原文地址:http://www.sharpgis.net/post/2015/05/21/Displaying-a-backbutton-in-your-app-window 免责声明:这篇文章基于 ...

  10. linux系统编程之进程(六):父进程查询子进程的退出,wait,waitpid

    本节目标: 僵进程 SIGCHLD wait waitpid 一,僵尸进程 当一个子进程先于父进程结束运行时,它与其父进程之间的关联还会保持到父进程也正常地结束运行,或者父进程调用了wait才告终止. ...