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 相关文章推荐
广告显示判断
Aug 31 Javascript
JScript 脚本实现文件下载 一般用于下载木马
Oct 29 Javascript
jquery自定义类似$.ajax()的方法实现代码
Aug 13 Javascript
javascript 获取网页标题代码实例
Jan 22 Javascript
jQuery 获取、设置HTML或TEXT内容的两种方法
May 23 Javascript
简单掌握JavaScript中const声明常量与变量的用法
May 21 Javascript
javascript解决小数的加减乘除精度丢失的方案
May 31 Javascript
js简单实现调整网页字体大小的方法
Jul 23 Javascript
JS实现数组按升序及降序排列的方法
Apr 26 Javascript
深究AngularJS如何获取input的焦点(自定义指令)
Jun 12 Javascript
BootStrap 标题设置跨行无效的解决方法
Oct 25 Javascript
es6 for循环中let和var区别详解
Jan 12 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
神族 PROTOSS 概述
2020/03/14 星际争霸
在PHP中养成7个面向对象的好习惯
2010/01/28 PHP
Windows下XDebug 手工配置与使用说明
2010/07/11 PHP
php发送短信验证码完成注册功能
2015/11/24 PHP
php实现的mongoDB单例模式操作类
2018/01/20 PHP
PHP SESSION机制的理解与实例
2019/03/22 PHP
用javascript编写的第一人称射击游戏
2007/02/25 Javascript
基于jQuery的日期选择控件
2009/10/27 Javascript
jQuery 淡出一个图像到另一个图像的实现代码
2013/06/12 Javascript
JavaScript的setAttribute兼容性问题解决方法
2013/11/11 Javascript
PHP+jQuery实现随意拖动层并即时保存拖动位置
2015/04/30 Javascript
js+HTML5实现canvas多种颜色渐变效果的方法
2015/06/05 Javascript
jQuery实现的简洁下拉菜单导航效果代码
2015/08/26 Javascript
基于JS实现导航条flash导航条
2016/06/17 Javascript
vue2.0 better-scroll 实现移动端滑动的示例代码
2018/01/25 Javascript
浅谈JavaScript中this的指向问题
2020/07/28 Javascript
Vuejs通过拖动改变元素宽度实现自适应
2020/09/02 Javascript
JS运算符优先级与表达式示例详解
2020/09/04 Javascript
在vant 中使用cell组件 定义图标该图片和位置操作
2020/11/02 Javascript
[00:49]完美世界DOTA2联赛10月28日开团时刻:随便打
2020/10/29 DOTA
一个小示例告诉你Python语言的优雅之处
2014/07/04 Python
在Python的gevent框架下执行异步的Solr查询的教程
2015/04/16 Python
python web框架学习笔记
2016/05/03 Python
python matplotlib 在指定的两个点之间连线方法
2018/05/25 Python
在PyCharm下使用 ipython 交互式编程的方法
2019/01/17 Python
Python使用numpy模块实现矩阵和列表的连接操作方法
2019/06/26 Python
使用批处理脚本自动生成并上传NuGet包(操作方法)
2019/11/19 Python
TensorFlow绘制loss/accuracy曲线的实例
2020/01/21 Python
详解css position 5种不同的值的用法
2019/07/30 HTML / CSS
一加手机美国官方网站:OnePlus美国
2019/09/19 全球购物
德国婴儿服装和婴儿用品购买网站:Baby Sweets
2019/12/08 全球购物
公安机关查摆剖析材料
2014/10/10 职场文书
父亲节活动总结
2015/02/12 职场文书
2015年政治教研组工作总结
2015/07/22 职场文书
vue 自定义的组件绑定点击事件
2022/04/21 Vue.js
vue @ ~ 相对路径 路径别名设置方式
2022/06/05 Vue.js