在“跨浏览器的事件处理程序: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的注释,基本就能理解本文代码的意图了!!