<!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>
因为绑定和解除的 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,就可以工作了
牛B啊--老是没想到法--谢谢你啦!!!