如果我将对象的方法注册为事件处理程序,我就无法将其删除。我错过了一些明显的东西,还是不能做到的?
function Test() {
document.body.addEventListener( 'click', this.handler.bind( this ), false );
}
Test.prototype.handler = function() {
document.body.innerHTML += '.';
document.body.removeEventListener( 'click', this.handler.bind( this ), false );
};
new Test();

body {
border: 1px solid black;
width: 100px;
height: 100px;
font-size: 30px;
}

答案 0 :(得分:3)
使用Function.prototype.bind
时,您将创建一个新功能。存储您自己对该函数的引用,然后使用它来订阅和取消订阅。
var obj = {
method: function () {
return this.prop;
},
prop: true
};
var getProp = obj.method.bind(obj);
myHtmlElement.addEventListener("click", getProp, false);
myHtmlElement.removeEventListener("click", getProp, false);
答案 1 :(得分:3)
每次拨打++
,您都会产生不同的功能:
bind
因此,func.bind(obj) === func.bind(obj); // false
不知道要删除哪个事件侦听器。
相反,您应该存储新功能:
removeEventListener
然后,您将能够添加或删除this.realHandler = this.handler.bind(this)
事件侦听器。