【问题标题】:How to avoid event handler get called when no namespace is defined如何避免在未定义命名空间时调用事件处理程序
【发布时间】:2014-08-03 17:30:04
【问题描述】:

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

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

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

最简单的方法是:

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

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

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

【问题讨论】:

  • 如果您不希望它们被其他 bar 事件触发,为什么不使用不同的事件名称?
  • 因为我不能每次都更改一些外部库,我现在不使用我也已经使用的名称。我认为 jQuery 的这种行为有点烦人。
  • 如果我理解你的问题(需要更好的例子),你不应该有bar 事件,如果你也使用bar 事件命名空间。它与第一部分匹配。
  • 我不使用没有命名空间的bar 事件。但是其他供应商的东西可以做到。问题是我无法想象可能被其他一些供应商使用的所有事件名称。而且它会让命名空间的想法变得毫无用处!
  • 使用一些前缀作为事件名称以避免与其他名称冲突。

标签: javascript jquery namespaces jquery-events


【解决方案1】:

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

$( 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. 垃圾收集器对垃圾收集器不太友好,因为当侦听器未注册时,它们仍会保留在内存中。

【讨论】:

  • 是的,我知道,但是当他这样做的时候我正在写最后一句话:)不客气。
  • 嗯,我明白了:)
【解决方案2】:

flec 指出了 jQuery out 的行为(参见 cmets):

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

所以看来我必须使用上面if (!e.namespace) return 的方法。 jQuery 在这一点上很烂。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-28
    • 2021-04-15
    • 2013-06-16
    • 2019-09-03
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    相关资源
    最近更新 更多