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

时间:2014-06-13 08:03:49

标签: javascript jquery javascript-events namespaces

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

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

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

最简单的方法是:

$('.foo').on('bar.foo', function(e) {
  if (!e.namespace) return
  ...
})

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

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

2 个答案:

答案 0 :(得分:0)

flec指出jQuery的行为(参见评论):

  

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

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

答案 1 :(得分:0)

事件命名空间主要用作帮助程序,以轻松取消绑定特定的匿名回调。

$( 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. 写作乏味
  2. 不是垃圾收集器非常友好,因为当侦听器未注册时,它们仍将保留在内存中。