php this指向问题,IE attachEvent() this作用域指向问题

在“跨浏览器的事件处理程序:https://www.phpvar.com/archives/2428.html”一文中,提到原生js的事件绑定操作,但未提到“事件处理程序,在ie9以下有this指向问题”。so,本文就这样诞生了....

首先得说明下,博客发文章会同步到新浪、腾讯微博以及QQ空间。同步到QQ空间的文章,代码部分都会变成不换行的显示格式。本人不怎么用QQ空间,但发现竟然有朋友去看了这段无格式的代码,并指出文章中“事件处理程序,在ie9以下有this指向问题”还没解决!好吧,无格式的代码也能看出问题来,哥只能说,这是牛人,只能膜拜了,哈....对于这位朋友,哥建议下次直接来博客看我文章吧,省事 !

直入主题,“事件处理程序,在ie下有this指向问题”,对于这个问题,我一开始想法是使用apply()改变handler this指向,但发现外层使用的是匿名函数,会使得事件无法解绑,须额外再处理,比较繁琐,推荐在事件处理程序中"弃用this,改用变量_this"的方法来处理!!

完整代码:

点我,运行绑定的点击事件!
点我解绑!!

var btn1=document.getElementById("test2");

var btn2=document.getElementById("test");

function handler(){

alert("this:"+this);

alert("this===window:"+String(this===window));//ie9以下,this指向的是window,而不是事件的目标元素!

var _this=event.srcElement||event.target;//弃用this,而改用_this变量:指向事件的目标元素ie使用event.srcElement,现代浏览器使用event.target

alert("this:"+this+"\n_this:"+_this);//_this 即始终指向事件的目标元素

alert("this.innerHTML:"+this.innerHTML+"\n_this.innerHTML:"+_this.innerHTML);

}

//绑定/解绑事件

var EventUtil={

addHandler:function(element,type,handler){

if(element.addEventListener){

element.addEventListener(type,handler,false);

}else if(element.attachEvent){

element.attachEvent("on"+type,handler);

//element.attachEvent("on"+type,function(){

//handler.apply(element,arguments);//使用apply()改变handler this指向,但外层使用的是匿名函数,会使得事件无法解绑,须额外再处理,比较繁琐,推荐在事件处理程序中"弃用this,改用变量_this"的方法来处理!!

//});

}else{

element["on"+type]=handler;

}

},

removeHandler:function(element,type,handler){

if(element.removeEventListener){

element.removeEventListener(type,handler,false);

}else if(element.detachEvent){

element.detachEvent("on"+type,handler);

}else{

element["on"+type]=null;

}

}

}

//绑定事件

EventUtil.addHandler(btn2,"click",handler);

//解绑事件

btn1.οnclick=function(){EventUtil.removeHandler(btn2,"click",handler);}

提示:你可以先修改部分代码再运行。

上述代码,关键的是handler()函数的处理,注意alert出来的内容,再理解下几个alert的注释,基本就能理解本文代码的意图了!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值