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图片预加载示例
Apr 30 Javascript
javascript实现C语言经典程序题
Nov 29 Javascript
浅析JavaScript声明变量
Dec 21 Javascript
jquery获取easyui日期控件的值实现方法
Nov 09 Javascript
jQuery事件与动画基础详解
Feb 23 Javascript
Vue.js 插件开发详解
Mar 29 Javascript
简单谈谈JS中的正则表达式
Sep 11 Javascript
bootstrap+jquery项目引入文件报错的解决方法
Jan 22 jQuery
vue-cli结合Element-ui基于cropper.js封装vue实现图片裁剪组件功能
Mar 01 Javascript
Vue 样式绑定的实现方法
Jan 15 Javascript
Vue中rem与postcss-pxtorem的应用详解
Nov 20 Javascript
交互式可视化js库gojs使用介绍及技巧
Feb 18 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面向对象三大特点学习(充分理解抽象、封装、继承、多态)
2012/05/07 PHP
国外十大最流行的PHP框架排名
2013/07/04 PHP
php读取txt文件并将数据插入到数据库
2016/02/23 PHP
php查询及多条件查询
2017/02/26 PHP
Laravel中为什么不使用blpop取队列详析
2018/08/01 PHP
基于Laravel 多个中间件的执行顺序详解
2019/10/21 PHP
jQuery1.4.2与老版本json格式兼容的解决方法
2011/02/12 Javascript
js 获取(接收)地址栏参数值的方法
2013/04/01 Javascript
实用的Jquery选项卡TAB示例代码
2013/08/28 Javascript
js中style.display=&quot;&quot;无效的解决方法
2014/10/30 Javascript
jquery实现动态改变div宽度和高度
2015/05/08 Javascript
js中substring和substr两者区别和使用方法
2015/11/09 Javascript
Node.js 日志处理模块log4js
2016/08/28 Javascript
ionic隐藏tabs的方法
2016/08/29 Javascript
tablesorter.js表格排序使用方法(支持中文排序)
2017/02/10 Javascript
Vue监听数据对象变化源码
2017/03/09 Javascript
Bootstrap table使用方法汇总
2017/11/17 Javascript
在Vue项目中取消ESLint代码检测的步骤讲解
2019/01/27 Javascript
JavaScript实现的九种排序算法
2019/03/04 Javascript
使用Element的InfiniteScroll 无限滚动组件报错的解决
2020/07/27 Javascript
vue项目查看vue版本及cli版本的实现方式
2020/10/24 Javascript
[44:58]2018DOTA2亚洲邀请赛 4.5 淘汰赛 LGD vs Liquid 第二场
2018/04/06 DOTA
详解python使用递归、尾递归、循环三种方式实现斐波那契数列
2018/01/16 Python
python实现远程通过网络邮件控制计算机重启或关机
2018/02/22 Python
PyCharm的设置方法和第一个Python程序的建立
2019/01/16 Python
Python3.5基础之变量、数据结构、条件和循环语句、break与continue语句实例详解
2019/04/26 Python
python实现ip地址查询经纬度定位详解
2019/08/30 Python
使用Python开发个京东上抢口罩的小实例(仅作技术研究学习使用)
2020/03/10 Python
Django数据统计功能count()的使用
2020/11/30 Python
五分钟学会怎么用Pygame做一个简单的贪吃蛇
2021/01/06 Python
校园餐饮创业计划书
2014/01/10 职场文书
偷看我的初中毕业鉴定
2014/01/29 职场文书
社区务虚会发言材料
2014/10/20 职场文书
导游词之澳门妈祖庙
2019/12/19 职场文书
一文读懂go中semaphore(信号量)源码
2021/04/03 Golang
Canvas绘制像素风图片的示例代码
2021/09/25 HTML / CSS