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 相关文章推荐
用JAVASCRIPT如何给&amp;lt;textarea&amp;gt;&amp;lt;/textarea&amp;gt;赋值
Apr 20 Javascript
JavaScript操作XML实例代码(获取新闻标题并分页,并分页)
May 25 Javascript
js调用webservice中的方法实现思路及代码
Feb 25 Javascript
jQuery.prop() 使用详解
Jul 19 Javascript
Windows下用PyCharm和Visual Studio开始Python编程
Oct 26 Javascript
jQuery设置和获取select、checkbox、radio的选中值方法
Jan 01 Javascript
div实现自适应高度的textarea实现angular双向绑定
Jan 08 Javascript
vue项目中,main.js,App.vue,index.html的调用方法
Sep 20 Javascript
微信运维交互机器人的示例代码
Nov 12 Javascript
js事件触发操作实例分析
Jun 21 Javascript
JavaScript生成随机验证码代码实例
Sep 28 Javascript
深入分析JavaScript 事件循环(Event Loop)
Jun 19 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
上海无线电三厂简史修改版
2021/03/01 无线电
十天学会php之第二天
2006/10/09 PHP
使用eAccelerator加密PHP程序
2008/10/03 PHP
php多层数组与对象的转换实例代码
2013/08/05 PHP
ThinkPHP 3使用OSS的方法
2018/07/19 PHP
CentOS7.0下安装PHP5.6.30服务的教程详解
2018/09/29 PHP
记Laravel调用Gin接口调用formData上传文件的实现方法
2019/12/12 PHP
读jQuery之七 判断点击了鼠标哪个键的代码
2011/06/21 Javascript
javascript里模拟sleep(两种实现方式)
2013/01/25 Javascript
JS加jquery简单实现标签元素的显示或隐藏
2013/09/23 Javascript
js实现可拖动DIV的方法
2013/12/17 Javascript
玩转方法:call和apply
2014/05/08 Javascript
JS显示下拉列表框内全部元素的方法
2015/03/31 Javascript
JQuery工具函数汇总
2015/06/15 Javascript
Bootstrap每天必学之导航条(二)
2016/03/01 Javascript
基于jquery编写的放大镜插件
2016/03/23 Javascript
使用MUI框架模拟手机端的下拉刷新和上拉加载功能
2017/09/04 Javascript
webpack将js打包后的map文件详解
2018/02/22 Javascript
Vue二次封装axios为插件使用详解
2018/05/21 Javascript
Vue运用transition实现过渡动画
2019/05/06 Javascript
python 巧用正则寻找字符串中的特定字符的位置方法
2018/05/02 Python
python实现列表中由数值查到索引的方法
2018/06/27 Python
浅谈利用numpy对矩阵进行归一化处理的方法
2018/07/11 Python
Python OOP类中的几种函数或方法总结
2019/02/22 Python
Python3.5运算符操作实例详解
2019/04/25 Python
Python使用QQ邮箱发送邮件报错smtplib.SMTPAuthenticationError
2019/12/20 Python
python字符串下标与切片及使用方法
2020/02/13 Python
利用Python的folium包绘制城市道路图的实现示例
2020/08/24 Python
Jupyter Notebook 远程访问配置详解
2021/01/11 Python
Columbia Sportswear法国官网:全球户外品牌
2020/09/25 全球购物
酒店中秋节促销方案
2014/01/30 职场文书
2014超市双十一活动策划方案
2014/09/29 职场文书
2015秋季小学开学寄语
2015/05/27 职场文书
为什么阅读对所有年龄段的孩子都很重要?
2019/07/08 职场文书
Java基础之详解HashSet的使用方法
2021/06/30 Java/Android
Centos7 Shell编程之正则表达式、文本处理工具详解
2022/08/05 Servers