attachEvent和addEventListener区别总结
1.attachEvent与addEventListener的区别
- 支持的浏览器不同。
attachEvent在IE9以下的版本中受到支持。其它的都支持addEventListener。 - 参数不同。
addEventListener第三个参数可以指定是否捕获,而attachEvent不支持捕获。 - 事件名不同。
attachEvent第一个参数事件名前要加on,比如el.attachEvent('onclick', handleClick)。 this不同。本文的将重点解释
2.attachEvent方式的事件绑定
attachEvent的this总是Window。例如:
el.attachEvent('onclick', function(){
    alert(this);
});
执行后会弹出对话框:[object Window]。
3.addEventListener方式的事件绑定
addEventListener的this总是当前正在处理事件的那个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对象提供了target和currentTarget属性来区分这当前对象与目标对象。 我们可以把它们都全部输出:
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区别总结的更多相关文章
- attachEvent和addEventListener区别
		
一般来说,可以直接封装成这种形式: var addEvent = function(element,type,handler){ if(element.addEventListener){ //DOM ...
 - attachEvent与addEventListener的区别 真实例子
		
转自:https://www.cnblogs.com/Rosefxd/p/4921330.html 近日遇到attachEvent与addEventListener两个事件,哟,果断研究一下~~ 先普 ...
 - (转载)JS事件监听 JS:attachEvent和addEventListener使用方法
		
(转载)http://www.chhua.com/web-note146 attachEvent和addEventListener使用方法 Js代码 <html> <head> ...
 - JS事件监听 JS:attachEvent和addEventListener 使用方法
		
attachEvent与addEventListener区别适应的浏览器版本不同,同时在使用的过程中要注意attachEvent方法 按钮onclickaddEventListene ...
 - attachEvent和addEventListener
		
attachEvent和addEventListener在前端开发过程中经常性的使用,他们都可以用来绑定脚本事件,取代在html中写obj.onclick=method. 相同点: 它们都是dom对象 ...
 - js中添加事件 attachEvent 与 addEventListener
		
给元素添加事件时,使用js进行实现时产生了疑惑,有关事件浏览器兼容的问题,在此记录如下. <!DOCTYPE html> <html> <head> <met ...
 - attachEvent与addEventlistener兼容性
		
关于原生事件绑定中attachEvent与addEventlistener中兼容性以及attachEvent函数中this指代window有关问题 请点击下面回答中的"采纳为答案&quo ...
 - JavaScript中的attachEvent和addEventListener
		
attachEvent和addEventListener在前端开发过程中经常性的使用,他们都可以用来绑定脚本事件,取代在html中写obj.onclick=method. 相同点: 它们都是dom对象 ...
 - attachEvent 与 addEventListener 的监听
		
说到 attachEvent 与 addEventListener 的事件必然会提到 浏览器的判断,因为attachEvent只适用于于IE 先来看看常用的浏览器的判断 //判断浏览器类型 if(n ...
 
随机推荐
- C++总的const使用说明
			
C++总的const使用说明 1. const修饰类成员变量 程序: #include <iostream> using namespace std; class A { public: ...
 - sublime text 插件 -- 获取文件名到剪贴板
			
日常开发使用 sublime text 有好长一段时间了,有时候想拷贝当前正在编辑的文件名时发现没有很快捷的方法,一般都是先点击右键菜单栏中的 Reveal in Side Bar 对文件进行定位(在 ...
 - Oracle EBS标准错误信息如何追踪 (Debug)
			
http://www.cnblogs.com/songdavid/articles/2067534.html 调用EBS标准API的时候,可能会返回一些让人看不懂的错误,比如最近我在开发rcv_tra ...
 - Nginx an upstream response is buffered to a temporary file
			
1.错误日志:warn:an upstream response is buffered to a temporary file 解决办法:增加fastcgi_buffers 8 4K; fa ...
 - Ajax 访问 或 获取 IIS 虚拟目录
			
使用场景 最近用 .net core mvc 写了一个工具类的项目,作为我们项目的后台管理网站使用.第一次被老大拿去部署的时候被告知不可用,同样的代码在我电脑和我的iis上都可以使用的啊. 后来才知道 ...
 - 关于linq的几个小例子
			
private void button1_Click(object sender, EventArgs e) { ] { ,,,,,,}; var result0 = from num in numb ...
 - JavaScript正则表达式匹配中英文以及常用标点符号白名单写法
			
我们在编程中经常会遇到特殊字符过滤的问题,今天我们提供一种白名单方式过滤 直接上代码 function RegEXP(s) { var rs = ""; for (var i = ...
 - .Net Core与跨平台时区
			
由于开发者不熟悉不同操作系统管理时区的方式,当用.Net Core开发与时区相关的应用运行在不同操作系统上会出现错误.这片文章将会探索一下在不同操作系统上用.Net Core 使用时区信息出现的问题与 ...
 - php类模块引擎PDO操作MySQL数据库简单阐述
			
PDO是什么呢? 通俗说就是别人写的一个“数据库操作工具类”,它非常强大,可以应对市面上几乎所有主流数据库, 具体应用时候有这样一个关系: 即,要操作某种数据,就得去“打开”对应的pdo引擎. 在ph ...
 - Win(Phone)10开发第(7)弹,Extended Execution
			
众所周知,在WindowsPhone8中,app在转入后台并且没有挂起的这段时间是可以继续运行的,此时可以继续执行程序的操作,这个功能在位置追踪app中时很有用的,当接电话来短信或者锁屏后不影响程序运 ...