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实现无刷新更新数据的详细步骤 asp
Dec 26 Javascript
两种WEB下的模态对话框 (asp.net或js的分别实现)
Dec 02 Javascript
jquery miniui 教程 表格控件 合并单元格应用
Nov 25 Javascript
js里怎么取select标签里的值并修改
Dec 10 Javascript
常用DOM整理
Jun 16 Javascript
JS实现带关闭功能的阿里妈妈网站顶部滑出banner工具条代码
Sep 17 Javascript
WebView启动支付宝客户端支付失败的问题小结
Jan 11 Javascript
AngularJS表单验证功能分析
May 26 Javascript
浅谈Vue数据绑定的原理
Jan 08 Javascript
layui实现下拉复选功能的例子(包括数据的回显与上传)
Sep 24 Javascript
jQuery中getJSON跨域原理的深入讲解
Sep 02 jQuery
CentOS 8.2服务器上安装最新版Node.js的方法
Dec 16 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实现转换html格式为文本格式的方法
2016/05/16 PHP
PHP文件管理之实现网盘及压缩包的功能操作
2017/09/20 PHP
PHP常用日期加减计算方法实例小结
2018/07/31 PHP
PHP删除数组中指定值的元素常用方法实例分析【4种方法】
2018/08/21 PHP
PHP实现简单注册登录系统
2020/12/28 PHP
Javascript - HTML的request类
2006/07/15 Javascript
js获取元素相对窗口位置的实现代码
2014/09/28 Javascript
Node.js中调用mysql存储过程示例
2014/12/20 Javascript
简单介绍JavaScript数据类型之隐式类型转换
2015/12/28 Javascript
深入解析JavaScript中的立即执行函数
2016/05/21 Javascript
详解JavaScript调用栈、尾递归和手动优化
2017/06/03 Javascript
详解react如何在组件中获取路由参数
2017/06/15 Javascript
Vue中计算属性computed的示例解读
2017/07/26 Javascript
浅谈vue的踩坑路
2017/08/31 Javascript
JavaScript实现兼容IE6的收起折叠与展开效果实例
2017/09/20 Javascript
JS获取input[file]的值并显示在页面的实现方法
2018/03/09 Javascript
简述vue状态管理模式之vuex
2018/08/29 Javascript
angular 用Observable实现异步调用的方法
2018/12/27 Javascript
JS制作简易计算器的实例代码
2020/07/04 Javascript
vue 实现一个简单的全局调用弹窗案例
2020/09/10 Javascript
js实现3D粒子酷炫动态旋转特效
2020/09/13 Javascript
分析Python的Django框架的运行方式及处理流程
2015/04/08 Python
python实现上传下载文件功能
2020/11/19 Python
Python项目跨域问题解决方案
2020/06/22 Python
pycharm 关闭search everywhere的解决操作
2021/01/15 Python
机关门卫制度
2014/02/01 职场文书
2014年元旦感言
2014/03/06 职场文书
《彭德怀和他的大黑骡子》教学反思
2014/04/12 职场文书
乡镇党委书记个人整改措施
2014/09/15 职场文书
学生检讨书范文
2015/01/27 职场文书
2015年保育员个人工作总结
2015/05/13 职场文书
舞出我人生观后感
2015/06/16 职场文书
检讨书怎么写?
2019/06/21 职场文书
css3带你实现3D转换效果
2022/02/24 HTML / CSS
GoFrame基于性能测试得知grpool使用场景
2022/06/21 Golang
Go本地测试解耦任务拆解及沟通详解Go本地测试的思路沟通的重要性总结
2022/06/21 Golang