在这个模块中,我正在努力,我有一个聆听者调整大小'窗口中的事件。每次运行模块时,我都需要检查是否已经有一个监听器注册到该事件并将其分离,以避免不必要的行为,内存泄漏等。
到目前为止一直很好,但是,在我们正在开发的这个应用程序中,很可能一些处理程序已经附加到“调整大小”上。事件,我无法调用$(window).off('resize')
,因为这将刷新之前由其他插件或模块注册的所有其他事件处理程序。
说到这里,我想知道是否有办法识别我的处理程序,只分离我自己注册的东西。如何在我的事件处理程序中设置标识符,以便在.off()
函数中引用?
任何帮助都会很好。
答案 0 :(得分:12)
这里有两个不同的建议。您可以为事件指定命名空间,也可以在绑定时传递非匿名函数。
$(window).on('resize.event1', function(){});
$(window).on('resize.event2', function(){});
//Only turn off event 2
$(window).off('resize.event2');
jQuery允许您识别您的活动。此行为称为命名空间。当前事件和事件名称必须用点分隔。在这种情况下,我绑定了2个resize事件(点的左侧),一个名为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
以来只会删除第二个函数!
答案 1 :(得分:1)
如果您使用命名处理程序(而不是匿名函数),您可以将处理程序的名称传递给off
以仅删除那个(http://api.jquery.com/off/)
function flash() {
$( "div" ).show().fadeOut( "slow" );
}
$( "body" ).off( "click", "#theone", flash )
答案 2 :(得分:1)
做这样的事情 -
$(window).off('resize.myCustomEvent');
反之亦然