Javascript(jquery) – 附加到一个事件的多个处理程序:如何只分离一个?

在这个模块中我正在研究我在窗口中有一个’resize’事件的监听器。 每次运行模块时,我都需要检查是否已经有一个监听器注册到该事件并将其分离,以避免不必要的行为,内存泄漏等。

到目前为止一切都那么好,但是,在我们正在研究的这个应用程序中,有些处理程序已经附加到’resize’事件并且我不能调用$(window).off('resize') ,因为这样会刷新之前由其他插件或模块注册的所有其他事件处理程序。

话虽如此,我想知道是否有办法识别我的处理程序,只分离我自己注册的东西。 如何在我的事件处理程序中设置标识符以便在.off()函数中引用?

你能帮忙的话,我会很高兴。

这有2个不同的建议。 您可以为事件指定命名空间,也可以在绑定时传递非匿名函数。

使用命名空间的示例:

 $(window).on('resize.event1', function(){}); $(window).on('resize.event2', function(){}); //Only turn off event 2 $(window).off('resize.event2'); 

jQuery允许您识别您的活动。 此行为称为命名空间。 当前事件和事件名称必须用点分隔。 在这种情况下,我绑定2resize事件(点的左侧),一个名称为event1 ,另一个名称为event2

通过标识事件,您可以在对象具有多个相同事件时删除(或触发)单个事件。

 $(window).trigger('resize'); //Trigger both; $(window).trigger('resize.event2'); //Trigger event2; 

使用命名函数的示例:

 $(window).on('resize', function1); $(window).on('resize', function2); //Only turn off event 2 $(window).off('resize', function2); 

如果传递的函数与当前事件函数匹配,则关联非匿名函数允许您删除事件。 因为function2 === function2 ,因为function1 !== function2只会删除第二个function1 !== function2

如果使用命名处理程序(而不是匿名函数),则可以将处理程序的名称传递给off以仅删除该处理程序( http://api.jquery.com/off/

 function flash() { $( "div" ).show().fadeOut( "slow" ); } $( "body" ).off( "click", "#theone", flash ) 

做这样的事 –

 $(window).off('resize.myCustomEvent'); 

反之亦然