Javascript - removeEventListener似乎得到了不同版本的处理程序?

时间:2016-03-30 04:10:37

标签: javascript events javascript-events event-handling mouseevent

我有一个Calendar类,实例化一次,然后在Calendar的构造函数中实例化一次EventHandler类。我通过绑定"这个"添加事件监听器。 (Calendar对象),所以我可以访问它们内部的Calendar对象。一切正常。

也就是说,直到我尝试在事件处理程序中添加事件侦听器并绑定"这个"它仍然是它们的Calendar对象。添加工作,但删除事件监听器不起作用。似乎删除正在获取我添加它时传递的函数的不同副本。这是在日历中添加事件监听器:

this.containerDiv.addEventListener("mousedown", this.eventHandler.calMousedown.bind(this));

然后在EventHandler的calMousedown中,我这样做:

this.containerDiv.addEventListener("mousemove", this.eventHandler.calMousemove.bind(this));

但是在另一个处理程序中,我删除了这样的监听器:

this.containerDiv.removeEventListener("mousemove", this.eventHandler.calMousemove.bind(this));

但它并没有删除它。 "这"应该是整个地方的单个Calendar对象,但它就像删除具有不同的函数副本一样。我已经验证了这个"这个"是所有处理程序中的Calendar对象。我还试图删除" .bind(this)"在删除,也没有工作。这怎么不删除?

1 个答案:

答案 0 :(得分:0)

bind创建一个新函数,但您可以缓存它:

var handler = this.eventHandler.calMousedown.bind(this);

this.containerDiv.addEventListener("mousedown", handler);
...
this.containerDiv.removeEventListener("mousedown", handler);