删除JQuery小部件的一个实例的事件处理程序

删除JQuery小部件的一个实例的事件处理程序,jquery,jquery-ui,javascript-events,Jquery,Jquery Ui,Javascript Events,我已经使用jQueryUI小部件工厂(在typescript中)编写了一个小部件 My widget侦听window元素上的滚动事件,因此在_create函数中添加了一个事件处理程序: _create = function () { $(window).on("scroll", this.handleScroll); } 在_destroy函数中,我想删除处理程序: _destroy = function () { $(window).off("scroll", this.hand

我已经使用jQueryUI小部件工厂(在typescript中)编写了一个小部件

My widget侦听window元素上的滚动事件,因此在_create函数中添加了一个事件处理程序:

_create = function () {
   $(window).on("scroll", this.handleScroll);
}
在_destroy函数中,我想删除处理程序:

_destroy = function () {
   $(window).off("scroll", this.handleScroll);
}
但是,在我的页面上可以有两个小部件实例:一个在常规页面中,另一个在弹出窗口中。我当前的实现删除了这两个实例的处理程序,这显然是不需要的

我已经读过这个问题:,接受的答案对于自定义事件来说很好,但是对于像“滚动”这样的标准事件,我看不到解决方案


任何想法都值得赞赏。

该解决方案也适用于您。如果您还没有这些小部件,请在页面和弹出窗口中为这两个小部件分配ID。然后,按如下方式修改代码:

_create = function () {
   $(window).on("scroll." + this.id, this.handleScroll);
}

_destroy = function () {
   $(window).off("scroll." + this.id, this.handleScroll);
}

请注意在调用on()和off()时滚动后的“.”。请参阅本文:和。

您提到的答案也适用于您的情况。你可以试试这样的

_create = function () {
   $(window).on("scroll." + this.id, this.handleScroll);
}

$(window).off('scroll.' + this.id);

见下面我的答案。如果它对你有效,你应该接受,这样这个答案就不会出现在现在登录的用户的问题流中。如果没有,或者您需要任何澄清,请给我留言。谢谢,我没有意识到这也适用于标准活动。我将此作为公认的答案,因为您的答案似乎是在roydukkey回答之前的第一秒:)名称空间事件对于具有动态内容的复杂应用程序来说非常棒。我在selectize小部件中添加和删除标记时使用了这个函数,在删除标记后,我没有函数引用来删除处理程序。这防止了内存泄漏问题。我以前不知道jquery中的名称空间事件。令人惊叹的!