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 相关文章推荐
jquery如何通过name名称获取当前name的value值
Dec 20 Javascript
jQuery制作简洁的多级联动Select下拉框
Dec 23 Javascript
理解和运用JavaScript的闭包机制
Aug 13 Javascript
Node.js本地文件操作之文件拷贝与目录遍历的方法
Feb 16 Javascript
Bootstrap CSS组件之分页(pagination)和翻页(pager)
Dec 17 Javascript
angularJS+requireJS实现controller及directive的按需加载示例
Feb 20 Javascript
简单谈谈React中的路由系统
Jul 25 Javascript
最通俗易懂的javascript变量提升详解
Aug 05 Javascript
微信小程序自定义模态对话框实例详解
Aug 16 Javascript
详解使用angular的HttpClient搭配rxjs
Sep 01 Javascript
mac上配置Android环境变量的方法
Jul 08 Javascript
vue实现表格合并功能
Dec 01 Vue.js
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
《雄兵连》《烈阳天道》真的来了
2020/07/13 国漫
jquery.cookie() 方法的使用(读取、写入、删除)
2013/12/05 Javascript
js生成随机数之random函数随机示例
2013/12/20 Javascript
js下将阿拉伯数字每三位一逗号分隔(如:15000000转化为15,000,000)
2014/06/02 Javascript
JavaScript使用循环和分割来替换和删除元素实例
2014/10/13 Javascript
JavaScript动态改变表格单元格内容的方法
2015/03/30 Javascript
JavaScript实现网站访问次数统计代码
2015/08/12 Javascript
js实现获取div坐标的方法
2015/11/16 Javascript
jquery trigger实现联动的方法
2016/02/29 Javascript
基于jQuery实现仿51job城市选择功能实例代码
2016/03/02 Javascript
浅谈js里面的InttoStr和StrtoInt
2016/06/14 Javascript
Jquery鼠标放上去显示全名的实现方法
2017/02/06 Javascript
详细AngularJs4的图片剪裁组件的实例
2017/07/12 Javascript
vue.js select下拉框绑定和取值方法
2018/03/03 Javascript
node(koa2) web应用模块介绍详解
2019/03/29 Javascript
Nodejs封装类似express框架的路由实例详解
2020/01/05 NodeJs
2019年度web前端面试题总结(主要为Vue面试题)
2020/01/12 Javascript
python使用正则搜索字符串或文件中的浮点数代码实例
2014/07/11 Python
使用Django和Python创建Json response的方法
2018/03/26 Python
Flask-Mail用法实例分析
2018/07/21 Python
Python爬虫爬取新浪微博内容示例【基于代理IP】
2018/08/03 Python
解决vscode python print 输出窗口中文乱码的问题
2018/12/03 Python
Python-Seaborn热图绘制的实现方法
2019/07/15 Python
python3.6+selenium实现操作Frame中的页面元素
2019/07/16 Python
Python求解正态分布置信区间教程
2019/11/20 Python
如何理解python对象
2020/06/21 Python
Blancsom美国/加拿大:服装和生活用品供应商
2018/07/27 全球购物
扩大国家免疫规划实施方案
2014/03/21 职场文书
小学作文评语大全
2014/04/21 职场文书
2014年幼儿园国庆主题活动方案
2014/09/16 职场文书
2014村党支部书记党建工作汇报材料
2014/11/02 职场文书
2015年度村委会工作总结
2015/04/29 职场文书
爱护环境卫生倡议书
2015/04/29 职场文书
2016年“6.26”禁毒宣传月系列活动总结
2016/04/05 职场文书
python实现自动化群控的步骤
2021/04/11 Python
对PyTorch中inplace字段的全面理解
2021/05/22 Python