首页 新闻 赞助 找找看

addEventListener 注册事件 如何改变this指向 并清除事件

0
悬赏园豆:50 [已解决问题] 解决于 2013-10-21 12:39

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
<script>
window.onload = function(){
 var box = new Box("box");
};
function Box(id){
 this.oDiv = document.getElementById(id);
 this.addHandler(this.oDiv, 'click', this.bindFunction(this, this.say));  //这里用bindFunction方法,改变了this的指向,指回到new出来的对象,执行了say方法
 
}
Box.prototype = {
 //绑定事件
 addHandler : function (elem, evType, fn){
  if(elem.attachEvent){
   elem.attachEvent('on'+evType,fn);
  }else if(elem.addEventListener){
   elem.addEventListener(evType,fn,false);
  }else{
   elem["on" + evType] = fn;
  }
 },
 
 //清除事件
 removeHandler : function (elem, evType, fn){   //elem元素, evType事件类型, fn函数
  if(elem.detachEvent){
   elem.detachEvent("on"+evType, fn);    //IE
  }else if(elem.removeEventListener){
   elem.removeEventListener(evType, fn, false);   //FF
  }else{
   elem["on" + evType] = null;
  }
 },
 
 //
 bindFunction : function(obj, func){
  return function(){
   func.apply(obj, arguments);
  }
 },
 
 say : function(){
  alert(this);  //这里打印出this已经指向了new出来的对象
  this.removeHandler(this.oDiv, 'click', this.say);   //接下来就要清除say方法, ====问题就出来这里,不管怎么样都无法清除,
  //大伙帮我看看,有点晕了。
 }
};
</script>
</head>

<body>
<div id="box">asdf</div>
</body>
</html>

YY砖仔的主页 YY砖仔 | 初学一级 | 园豆:133
提问于:2013-10-19 10:57
< >
分享
最佳答案
0

因为绑定和解除的 function 不一样,所以不能工作

 

你可以在BOX的构造函数里面,把

 this.addHandler(this.oDiv, 'click', this.bindFunction(this, this.say));

改成

this.mySay=this.bindFunction(this, this.say);

this.addHandler(this.oDiv, 'click',this.mySay);

然后再把 say 里面的

 this.removeHandler(this.oDiv, 'click', this.say);

改成

 this.removeHandler(this.oDiv, 'click', this.mySay);

 

这样大家都是使用 this.mySay,就可以工作了

收获园豆:50
Yu | 专家六级 |园豆:12980 | 2013-10-19 22:56

牛B啊--老是没想到法--谢谢你啦!!!

YY砖仔 | 园豆:133 (初学一级) | 2013-10-21 12:39
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册