Javascript 如何避免在未定义命名空间时调用事件处理程序

Javascript 如何避免在未定义命名空间时调用事件处理程序,javascript,jquery,javascript-events,namespaces,Javascript,Jquery,Javascript Events,Namespaces,假设一组事件处理程序如下所示: $('.foo').on('bar.foo', function(e) {...}) 它们仅适用于bar.foo事件。不幸的是,它们也被称为bar事件,由外部插件和我不知道的LIB触发 最简单的方法是: $('.foo').on('bar.foo', function(e) { if (!e.namespace) return ... }) 但问题是有很多事件处理程序。当只有bar被触发时,是否有其他可能阻止对bar.foo调用这些事件处理程序 编辑:

假设一组事件处理程序如下所示:

$('.foo').on('bar.foo', function(e) {...})
它们仅适用于bar.foo事件。不幸的是,它们也被称为bar事件,由外部插件和我不知道的LIB触发

最简单的方法是:

$('.foo').on('bar.foo', function(e) {
  if (!e.namespace) return
  ...
})
但问题是有很多事件处理程序。当只有bar被触发时,是否有其他可能阻止对bar.foo调用这些事件处理程序


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

flec指出jQuery的行为请参见注释:

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


因此,似乎我必须使用上述方法,如果!e、 名称空间返回。jQuery在这一点上很糟糕。

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

$( 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' );
否则,您需要保存对自定义侦听器函数的引用,即:

乏味的写作 垃圾收集器不是很友好,因为当监听器被注销时,垃圾收集器仍将保留在内存中。
如果您不想为其他bar事件触发它们,为什么不使用不同的事件名称呢?因为我不能每次都更改我现在不使用的外部库,因为我已经使用了该名称。我认为jQuery的这种行为有些烦人。如果我理解您的问题需要更好的示例,那么如果您还使用bar事件名称空间,就不应该使用bar事件。它与第一部分匹配。我不使用没有名称空间的bar事件。但其他供应商的东西可以做到这一点。问题是我无法想象其他供应商可能使用的所有事件名称。这将使名称空间的想法毫无用处!为活动名称使用一些前缀以避免与其他人发生冲突。是的,我知道,但他这么做时我正在写最后一句话:不客气。啊,好的,我理解: