看到zhenn在BLOG里提到的一个关于监听中THIS的问题,感觉很好,一般我们的监听解决方案如下:
function bindEvent(elem,type,fn){
if(elem.attachEvent){
elem.attachEvent(“on”+type,fn);
}else{
elem.addEventListener(type,fn,false);
}
}
//调用
bindEvent(obj,”click”,fn1);
bindEvent(obj,”click”,fn2);
bindEvent(obj,”mouseover”,function(){alert(this)}) //this->window
但此时THIS一直指向WINDOW,所以我们也会
- function bindEvent(elem,type,fn){
- if(elem.attachEvent){
- elem.attachEvent(“on”+type,function(){
- fn.apply(elem,arguments);
- });
- }else{
- elem.addEventListener(type,fn,false);
- }
- }
- bindEvent(obj,”mouseover”,function(){alert(this)}) //this->elem
但是还有一个问题亟待解决,因为在attachEvent中使用了匿名函数来执行fn,导致在无法使用detachEvent来删除绑定的某个代码片段,也许obj["on"+type] = null可以解决,清空绑定的代码片段,这很粗暴邪恶,同时也违背我们的业务需求。
zhenn的方案
- //绑定事件
- function bindEvent(elem,type,fn){
- if(elem.attachEvent){
- var typeRef = ”_” + type;
- if(!elem[typeRef]){
- elem[typeRef] = [];
- }
- for(var i in elem[typeRef]){
- if(elem[typeRef][i] == fn){
- return;
- }
- }
- elem[typeRef].push(fn);
- elem["on"+type] = function(){
- for(var i in this[typeRef]){
- this[typeRef][i].apply(this,arguments);
- }
- }
- }else{
- elem.addEventListener(type,fn,false);
- }
- }
- //移除事件绑定
- function removeEvent(elem,type,fn){
- if(elem.detachEvent){
- if(elem["_"+type]){
- for(var i in elem["_"+type]){
- if(elem["_"+type][i] == fn){
- elem["_"+type].splice(i,1);
- break;
- }
- }
- }
- }else{
- elem.removeEventListener(type,fn,false);
- }
- }