addEventListener和attachEvent二者绑定的执行函数中的this不相同【转载】

yuanwen http://www.jb51.net/article/32511.htm

写 addEventListener 和 attachEvent 区别的博文不少,不过大部分都把重点放置于前者是Firefox chrome,后者只是存在于IE系列中

写 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。

时间: 2024-12-26 08:59:33

addEventListener和attachEvent二者绑定的执行函数中的this不相同【转载】的相关文章

为什么代码要写到匿名自执行函数中?

1. 为啥让你把代码写到匿名自执行函数中 // 目的是为了防止变量命名空间污染 // 1. 防止污染别的变量 // 2. 防止被别人污染 // 3. 表明这是一个独立的模块 // 原理:函数有作用域 2. 为什么把 window 传递到了匿名自执行函数中 // 1. 声明当前js文件模块的依赖项 // 2. 减少作用域查找范围,提高代码执行效率 ;(function (w, d, Vue, $) { // code here })(window, document, Vue, jquery) 原

input file 添加图片预览 绑定onchange执行函数 重复添加不执行onchange函数

问题描述: input file上传图片 绑定了onchange执行函数,是在选择的图片发生变化时才会触发onchange的函数.当我们添加图片并预览时,遇到添加同一张图片或者,添加后删除再添加同一张图片时,不会触发onchange事件. 解决方法: 1.在执行的onchange里的函数最后重新生成一段input file html代码替换掉原来的input file $('#cFile').replaceWith('<input type="file" id="cFi

setTimeout中所执行函数中的this,永远指向window

注意是要延迟执行的函数中的this哦!! //片段一 setTimeout("alert(this)", 1); // [object Window] //片段二 var obj = { say: function() { setTimeout("alert('in obj ' + this)", 0) } } obj.say(); //片段三 var obj = { say: function() { setTimeout(function(){alert(thi

三. var let const的理解 以及 立即执行函数中的使用 以及 for循环中的例子

一. 立即执行函数 windows中有个name属性,name='' '' var 如果我们用var name 去声明,那就会改变windows中name的值(因为我们不是在函数作用域中声明的,所以会覆盖全局的值) 为了避免这种问题,通常我们写一个立即执行函数(可读性不高) const 同样,如果我们用const去声明,也会改变全局的name属性 我们把const声明写在大括号里面,就不会改变全局的name属性了 二. for循环 常见的for循环,console.log(i) 会输出10,wh

学习js即时执行函数中的this关键字详解

this是Javascript语言的一个关键字. 它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用.比如, function test(){ this.x = 1; } 随着函数使用场合的不同,this的值会发生变化.但是有一个总的原则,那就是this指的是,调用函数的那个对象. 下面分四种情况,详细讨论this的用法. 情况一:纯粹的函数调用 这是函数的最通常用法,属于全局性调用,因此this就代表全局对象Global. 请看下面这段代码,它的运行结果是1. function te

关于自执行函数

当我们在使用for循环,但又不期望for循环 中循环的变量值影响之后其他函数中的循环值, 我们可以将该for循环放在自执行函数中,例如 for( var i=0;i<5;i++){ console.log(i); } 如果我们不希望在该for循环之后再使用i受到影响,只需要这么写 (function(){ for( var i=0;i<5;i++){ console.log(i); } })(): 自循环三种写法: 1.        (function(){})(); 2.        (

前端面试之立即执行函数

什么是立即执行函数 声明一个函数,并马上调用这个匿名函数就叫做立即执行函数.在定义好一个函数后,直接执行. (function() {alert('立即执行函数')})() 用声明一个函数,用括号包起来,调用此函数. 立即执行函数的写法 有时候,我们定义函数以后,立即调用该函数,这时不能在函数的定义后面直接加圆括号,这会产生语法错误.产生语法错误的原因是,function这个关键字,既可以当做语句,也可以当做表达式. //语句 function fn() {}; //表达式 var fn = f

【JavaScript】彻底明白this在函数中的指向

一.this,其实可以类比成人 说到this的话,我们在js中主要研究的都是函数中的this,在javascript中,this代表当前行为的执行主体,而context代表的是当前行为执行的的环境(区域). 例如男神在北理珠吃饭,这句话分别代表的含义如下 男神    -->> 主体(this) 吃饭    -->> 函数(function) 北理珠 -->> 环境(context) -->>说明:吃饭是函数,男神是函数的主体,北理珠就是当前行为的执行环境(c

javascript绑定事件addEventListener与attachEvent

1.eleObj.addEventListener(eventName,handle,useCapture); eleObj:DOM元素: eventName:事件名称.注意,这里的事件名称没有“ on ”,如鼠标单击事件 click ,鼠标双击事件 doubleclick ,鼠标移入事件 mouseover,鼠标移出事件 mouseout 等. handle:事件句柄函数,即用来处理事件的函数: useCapture:Boolean类型,是否使用捕获,一般用false: 2.eleObj.at