使用对象的方法作为事件处理程序,如何删除它?

时间:2015-08-31 23:19:22

标签: javascript

如果我将对象的方法注册为事件处理程序,我就无法将其删除。我错过了一些明显的东西,还是不能做到的?



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;
}




2 个答案:

答案 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) 事件侦听器。