removeEventListener似乎正在获得不同版本的处理程序

removeEventListener seems to be getting a different version of the handler?

本文关键字:版本 处理 程序 removeEventListener      更新时间:2023-09-26

我有一个Calendar类,实例化一次,然后在Calendar的构造函数中实例化一次EventHandler类。 我通过将this事件侦听器(Calendar对象(绑定到事件侦听器来添加它们,以便我可以访问它们中的Calendar对象。 这一切都很好用。

也就是说,直到我尝试在事件处理程序中添加事件侦听器并将this仍然是它们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));

但它不会删除它。 this应该是到处都是单个Calendar对象,但就好像删除具有不同的函数副本一样。 我已经验证this是所有处理程序中的Calendar 对象。 我还尝试删除删除.bind(this),这也不起作用。 这怎么不删除?

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

var handler = this.eventHandler.calMousedown.bind(this);
this.containerDiv.addEventListener("mousedown", handler);
...
this.containerDiv.removeEventListener("mousedown", handler);