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 相关文章推荐
js 操作符实例代码
Oct 24 Javascript
jquery队列queue与原生模仿其实现方法分享
Mar 25 Javascript
对new functionName()定义一个函数的理解
May 22 Javascript
浅谈JavaScript中null和undefined
Jul 09 Javascript
javascript的变量、传值、传址、参数之间关系
Jul 26 Javascript
javascript实现简易计算器
Feb 01 Javascript
JavaScript canvas实现围绕旋转动画
Nov 18 Javascript
vue.js学习笔记之v-bind和v-on解析
May 03 Javascript
angularjs实现对表单输入改变的监控(ng-change和watch两种方式)
Aug 29 Javascript
nvm、nrm、npm 安装和使用详解(小结)
Jan 17 Javascript
Vue 列表上下过渡效果的实例代码
Jun 25 Javascript
小程序实现搜索框功能
Mar 26 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
在DC的漫画和电影中,蝙蝠侠的宿敌,小丑的真名是什么?
2020/04/09 欧美动漫
深入了解 register_globals (附register_globals=off 网站打不开的解决方法)
2012/06/27 PHP
推荐几款用 Sublime Text 开发 Laravel 所用到的插件
2014/10/30 PHP
Javascript中eval函数的使用方法与示例
2007/04/09 Javascript
解析jQuery与其它js(Prototype)库兼容共存
2013/07/04 Javascript
Javascript 命名空间模式
2013/11/01 Javascript
JS实现侧悬浮浮动实例代码
2013/11/29 Javascript
jquery form 加载数据示例
2014/04/21 Javascript
angularJS中$apply()方法详解
2015/01/07 Javascript
Jquery中$.post和$.ajax的用法小结
2015/04/28 Javascript
javascript实现根据时间段显示问候语的方法
2015/06/18 Javascript
jquery简单实现带渐显效果的选项卡菜单代码
2015/09/01 Javascript
基于jQuery 实现bootstrapValidator下的全局验证
2015/12/07 Javascript
简单学习vue指令directive
2016/11/03 Javascript
ExtJs的Ext.Ajax.request实现waitMsg等待提示效果
2017/06/14 Javascript
Vue.js学习笔记之修饰符详解
2017/07/25 Javascript
小程序实现按下录音松开识别语音
2019/11/22 Javascript
Python 冒泡,选择,插入排序使用实例
2015/02/05 Python
Python编程中的文件操作攻略
2015/10/16 Python
Python实现修改IE注册表功能示例
2018/05/10 Python
python实现搜索文本文件内容脚本
2018/06/22 Python
学生信息管理系统python版
2018/10/17 Python
python3应用windows api对后台程序窗口及桌面截图并保存的方法
2019/08/27 Python
详解Django配置优化方法
2019/11/18 Python
python定间隔取点(np.linspace)的实现
2019/11/27 Python
Python通过Schema实现数据验证方式
2020/11/12 Python
如何通过安装HomeBrew来安装Python3
2020/12/23 Python
pycharm进入时每次都是insert模式的解决方式
2021/02/05 Python
施华洛世奇日本官网:SWAROVSKI日本
2018/05/04 全球购物
几个MySql的面试题
2013/04/22 面试题
女生节标语
2014/06/26 职场文书
施工安全责任书范本
2014/07/24 职场文书
机动车交通事故协议书
2015/01/29 职场文书
关于调整工作时间的通知
2015/04/24 职场文书
卡特教练观后感
2015/06/08 职场文书
SqlServer: 如何更改表的文件组?(进而改变存储位置)
2021/04/05 SQL Server