addEventListener和attachEvent二者绑定的执行函数中的this不相同


Posted in Javascript onDecember 09, 2012

写 addEventListener 和 attachEvent 区别的博文不少,不过大部分都把重点放置于前者是Firefox chrome,后者只是存在于IE系列中。

最近在写一个事件代理的时候,遇到一个BUG,发现除此外,二者绑定的执行函数中的 this 是不相同的,addEventListener 和 attachEvent函数在运行时候的上下文是不相同的。
用了一个简单的demo来描述这个不同点:

<html xmlns="http://www.w3.org/1999/xhtml"> 
<<head> 
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> 
<<title>测试</title> 
</head> 
<<body> 
<div id="div1"> 
<a href="#" id="a1">test1</a> 
</div> 
<<div id="div2"> 
<a href="#" id="a2">test2</a> 
</div> 
</body> 
<<script type="text/javascript"> 
var testGolb = "diff"; // 定义一个全局变量 
var a1 = document.getElementById( "a1"); 
var a2 = document.getElementById( "a2"); 
function getEleId ( e) { 
// body... 
alert( this.id); 
alert( this.testGolb); 
} 
a1.onclick = getEleId; 
if( a2.attachEvent){ 
a2.attachEvent( "onclick", getEleId); 
}else{ 
a2.addEventListener( 'click',getEleId); 
} 
</script> 
</html>

点击 test1
chrome 下 第一次alert:" a1",第二次alert :"undefined"
firefox 下 第一次alert:" a1",第二次alert :"undefined"
IE 中 第一次alert:" a1",第二次alert :"undefined"
这很好理解,这时候的this指向 #a1 这个DOM,所以alert id是 #a1的id “a1”,然后在this中,并没有testGolb这个变量,所以是undefined
点击 test2
chrome下 第一次alert:" a1",第二次alert :"undefined"
firefox 下 第一次alert:" a1",第二次alert :"undefined"
IE 中 第一次alert:" undefined",第二次alert :"diff"

chrome 和 firefox同点击test1时候的表现是一致的,而IE就不同了。使用attachEvent绑定事件时候,函数中的this指向的是window,并不是添加事件的dom,所以第一次的alert 值是 undefined,而this.testGlob 的值是diff。

Javascript 相关文章推荐
学习ExtJS TextField常用方法
Oct 07 Javascript
js 操作符实例代码
Oct 24 Javascript
Javascript Boolean、Nnumber、String 强制类型转换的区别详细介绍
Dec 13 Javascript
关于extjs4如何获取grid修改后的数据的问题
Aug 07 Javascript
使用insertAfter()方法在现有元素后添加一个新元素
May 28 Javascript
浅析Node.js中的内存泄漏问题
Jun 23 Javascript
jquery实现的3D旋转木马特效代码分享
Aug 25 Javascript
微信小程序(应用号)简单实例应用及实例详解
Sep 26 Javascript
Javascript for in的缺陷总结
Feb 03 Javascript
JS实现基于拖拽改变物体大小的方法
Jan 23 Javascript
angularJS自定义directive之带参方法传递详解
Oct 09 Javascript
JavaScript实现简单贪吃蛇效果
Mar 09 Javascript
Javascript获取窗口(容器)的大小及位置参数列举及简要说明
Dec 09 #Javascript
定义JavaScript二维数组采用定义数组的数组来实现
Dec 09 #Javascript
javascript操作JSON的要领总结
Dec 09 #Javascript
js写一个弹出层并锁屏效果实现代码
Dec 07 #Javascript
JavaScript之Getters和Setters 平台支持等详细介绍
Dec 07 #Javascript
缓动函数requestAnimationFrame 更好的实现浏览器经动画
Dec 07 #Javascript
javascrpt绑定事件之匿名函数无法解除绑定问题
Dec 06 #Javascript
You might like
PHP基础学习小结
2011/04/17 PHP
php比较两个字符串长度的方法
2015/07/13 PHP
PHP使用xpath解析XML的方法详解
2017/05/20 PHP
PHP获取日期对应星期、一周日期、星期开始与结束日期的方法
2018/06/22 PHP
PHP扩展Swoole实现实时异步任务队列示例
2019/04/13 PHP
js滚动条多种样式,推荐
2007/02/05 Javascript
Jquery下的26个实用小技巧(jQuery tips, tricks &amp; solutions)
2010/03/01 Javascript
给jqGrid数据行添加修改和删除操作链接(之一)
2011/11/04 Javascript
通过一段代码简单说js中的this的使用
2013/07/23 Javascript
js限制文本框只能输入数字方法小结
2014/06/16 Javascript
Bootstrap表单布局
2016/07/19 Javascript
详解js的事件代理(委托)
2016/12/22 Javascript
轻松理解JavaScript之AJAX
2017/03/15 Javascript
vue调用高德地图实例代码
2017/04/28 Javascript
JavaScript实现微信红包算法及问题解决方法
2018/04/26 Javascript
vue 国际化 vue-i18n 双语言 语言包
2018/06/07 Javascript
解决vue项目中某一页面不想引用公共组件app.vue的问题
2020/08/14 Javascript
OpenLayers3实现测量功能
2020/09/25 Javascript
[01:13:18]Secret vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
在Docker上部署Python的Flask框架的教程
2015/04/08 Python
Python列表list操作符实例分析【标准类型操作符、切片、连接字符、列表解析、重复操作等】
2017/07/24 Python
python导包的几种方法(自定义包的生成以及导入详解)
2019/07/15 Python
MATLAB数学建模之画图汇总
2020/07/16 Python
python 实现性别识别
2020/11/21 Python
HTML5新增的标签和属性归纳总结
2018/05/02 HTML / CSS
巴西体育用品商店:Lojão dos Esportes
2018/07/21 全球购物
Vivo俄罗斯官方在线商店:中国智能手机品牌
2019/10/04 全球购物
C++如何引用一个已经定义过的全局变量
2014/08/25 面试题
应届生煤化工求职信
2013/10/21 职场文书
消防安全责任书范本
2014/04/15 职场文书
环保建议书100字
2014/05/14 职场文书
辩论赛开场白大全(主持人+辩手)
2015/05/29 职场文书
Django 如何实现文件上传下载
2021/04/08 Python
图文详解Nginx版本平滑升级方案
2021/09/15 Servers
根德5570型九灯四波段立体声收音机是电子管收音机的楷模 ? 再论5570
2022/04/05 无线电
Mysql中@和@@符号的详细使用指南
2022/06/05 MySQL