如何避免在没有定义名称空间时调用事件处理程序

How to avoid event handler get called when no namespace is defined

本文关键字:空间 调用 事件处理 程序 何避免 定义      更新时间:2023-09-26

假设一堆这样的事件处理程序:

$('.foo').on('bar.foo', function(e) {...})

它们仅用于bar.foo事件调用。不幸的是,它们也被称为bar事件,由外部插件和库触发,我不知道。

最简单的方法是:
$('.foo').on('bar.foo', function(e) {
  if (!e.namespace) return
  ...
})

但是问题是有很多事件处理程序。当只有bar被触发时,是否有其他可能阻止bar.foo调用这些事件处理程序?

编辑:重命名bar事件在这种情况下不是一个解决方案。

事件名称空间主要用于帮助轻松解除特定匿名回调的绑定。

$( body ).on( 'click', function() {
    console.log( 'Default click on body' );
});
$( body ).on( 'click.myCustomPluginNamespace', function() {
    console.log( 'Custom plugin click on body' );
});
// On plugin cleanup, to leave the default binding intact.
$( body ).off( 'click.myCustomPluginNamespace' );
如果没有这个,您需要保存对自定义侦听器函数的引用,即:
  1. 不是很友好的垃圾收集器,因为当侦听器未注册时,这些仍然会留在内存中。

flec指出了jQuery的行为(见注释):

在您的情况下,此行为似乎无用,但在大多数情况下,这是预期的行为。例如,如果你想有一个点击处理程序,你想稍后删除,但保留其他处理程序不变。

所以我似乎必须使用上面的if (!e.namespace) return的方法。jQuery在这一点上很糟糕