解决IE attachEvent绑定的事件中this为window问题

  在IE浏览器下使用attachEvent绑定对象的事件时,绑定的事件方法中this对象为window对象,而不是当前的DOM对象。w3c浏览器下的addEventListener对象不存在这种问题。

 

  测试代码如下

<div id="dv">111</div>
<script>
function Alert(){alert(this.innerHTML)}
var dvs=document.getElementById('dv')
dv.attachEvent('onclick',Alert);//这样添加事件,this为window对象,所以函数Alter中输出undefined
</script>

解决办法

<div id="dv">111</div>
<script>
function Alert(){alert(this.innerHTML)}
var dvs=document.getElementById('dv')
dv.attachEvent('onclick',function(){Alert.call(dv)});//通过apply或者call方法更改函数Alert中的上下文,这样Alert中this对象就为div对象了
</script>

如果是多个div,for循环绑定事件时,需要处理一下传递的对象,做个闭包

<div>111</div>
<div>222</div>
<div>333</div>
<script>
function Alert(){alert(this.innerHTML)}
var dvs=document.getElementsByTagName('div')
for(var i=0;i<dvs.length;i++){
  dvs[i].attachEvent('onclick',(function(i){return function(){Alert.apply(dvs[i]);}})(i));//需要做闭包,然后通过apply或者call方法更改函数Alert中的上下文,这样Alert中this对象就为当前的div对象了
}
</script>

 

加支付宝好友偷能量挖...


原创文章,转载请注明出处:解决IE attachEvent绑定的事件中this为window问题

评论(0)Web开发网
阅读(271)喜欢(1)JavaScript/Ajax开发技巧