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的实现回车键Enter切换焦点
Sep 14 Javascript
JQuery中getJSON的使用方法
Dec 13 Javascript
js清理Word格式示例代码
Feb 13 Javascript
JS事件添加和移出的兼容写法示例
Jun 20 Javascript
AngularJS基础 ng-model-options 指令简单示例
Aug 02 Javascript
jQuery实现的放大镜效果示例
Sep 13 Javascript
VueJs路由跳转——vue-router的使用详解
Jan 10 Javascript
使用jQuery和ajax代替iframe的方法(详解)
Apr 12 jQuery
详解Vue用自定义指令完成一个下拉菜单(select组件)
Oct 31 Javascript
教你完全理解ReentrantLock重入锁
Jun 03 Javascript
nuxt踩坑之Vuex状态树的模块方式使用详解
Sep 06 Javascript
vue 解决addRoutes多次添加路由重复的操作
Aug 04 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 页面编码声明方法详解(header或meta)
2010/03/12 PHP
浅谈thinkphp的实例化模型
2015/01/04 PHP
php使用自定义函数实现汉字分割替换功能示例
2017/01/30 PHP
PHP7中I/O模型内核剖析详解
2019/04/14 PHP
Laravel5框架自定义错误页面配置操作示例
2019/04/17 PHP
ext 代码生成器
2009/08/07 Javascript
jquery实现预览提交的表单代码分享
2014/05/21 Javascript
JavaScript字符串对象fromCharCode方法入门实例(用于把Unicode值转换为字符串)
2014/10/17 Javascript
JavaScript之Object类型介绍
2015/04/01 Javascript
JavaScript使用Replace进行字符串替换的方法
2015/04/14 Javascript
javascript+HTML5的Canvas实现Lab单车动画效果
2015/08/07 Javascript
轻松实现javascript数据双向绑定
2015/11/11 Javascript
jQuery实现图片走马灯效果的原理分析
2016/01/16 Javascript
微信小程序 弹幕功能简单实例
2017/02/14 Javascript
基于JavaScript实现活动倒计时效果
2017/04/20 Javascript
Vue实现textarea固定输入行数与添加下划线样式的思路详解
2018/06/28 Javascript
mpvue微信小程序多列选择器用法之省份城市选择的实现
2019/03/07 Javascript
[46:16]2018DOTA2亚洲邀请赛3月30日 小组赛B组 iG VS VP
2018/03/31 DOTA
python中正则表达式的使用详解
2014/10/17 Python
简单介绍Python中的filter和lambda函数的使用
2015/04/07 Python
Python实现Windows和Linux之间互相传输文件(文件夹)的方法
2017/05/08 Python
为什么选择python编程语言入门黑客攻防 给你几个理由!
2018/02/02 Python
PyQt5每天必学之日历控件QCalendarWidget
2018/04/19 Python
python实现自动发送报警监控邮件
2018/06/21 Python
Django 实现购物车功能的示例代码
2018/10/08 Python
python使用Plotly绘图工具绘制柱状图
2019/04/01 Python
Python的赋值、深拷贝与浅拷贝的区别详解
2020/02/12 Python
python自定义函数def的应用详解
2020/06/03 Python
Keras中的两种模型:Sequential和Model用法
2020/06/27 Python
python中turtle库的简单使用教程
2020/11/11 Python
前端H5 Video常见使用场景简介
2020/08/21 HTML / CSS
美国最大的存储市场:SpareFoot
2018/07/23 全球购物
职业教育毕业生求职信
2013/11/09 职场文书
电脑专业个人求职信范文
2014/02/04 职场文书
2014年终工作总结范本
2014/12/15 职场文书
python使用pymysql模块操作MySQL
2021/06/16 Python