9

jQuery 事件有一个内置的命名空间概念,可以轻松安全地解除您添加的事件的绑定。

然而,当不同的插件触发相同的基本事件时,这些命名空间并不能防止冲突。例如,如果插件 A 触发hide.foo事件而插件 B 触发hide.bar事件,则任何侦听hide事件的处理程序都将被调用两次,即使使用命名空间也是如此。

当插件触发过于通用的名称(如open, close, show, hide, start,end等)时,这可能会导致问题,但是那里有如此多的插件(甚至来自 jQueryUI 和 bootstrap 等大型库的插件)在没有二级命名空间的情况下触发这些通用事件。

所以这是我的问题。似乎第二级命名空间是谨慎的,既可以将您的事件与其他插件和标准 DOM 事件区分开来。约定可能类似于namespace:eventNamenamespace:eventName.secondaryNamespace使用标准的 jQuery 点表示法。

但似乎没有人这样做,所以我想知道是否有一些令人信服的理由不这样做。有人知道吗?

更新:

举一个更具体的例子,假设我正在使用插件 A,当用户将鼠标悬停在某些文本上时,它会触发工具提示上的show和 事件。hide由于事件传播并且我的 DOM 不断变化,我决定将我的事件侦听器绑定到元素以从所有工具提示document中捕获show和事件。hide

然后,几周后,我将插件 B 添加到我的应用程序中,这也会hide在用户关闭警报消息后触发事件。现在突然之间,我的工具提示代码将被调用超过我想要的,因为工具提示和警报消息插件都在触发具有相同名称的事件。

4

1 回答 1

1

事实证明,我特别提到的两个库(jQueryUI 和 Bootstrap)要么正在做,要么正在计划为其自定义事件添加前缀。

这是 jQueryUI 在其自定义_trigger方法中所做的:

event.type = ( type === this.widgetEventPrefix ? type : this.widgetEventPrefix + type ).toLowerCase();

this.widgetEventPrefix这允许您通过在任何包含的小部件或您使用小部件工厂制作的小部件上定义自己的前缀。

Bootstrap 尚未实现前缀,但计划在下一个主要版本(3.0.0)中实现。

这是@fat 在这个Github 问题中所说的:

将来我们可能会使用引导程序命名所有内容(数据属性和事件 - 但这将是 3.0.0 的东西,因为它破坏了向后兼容性)

这是他的推文,以回答我的问题。

--

至于我,我决定使用以下模式之一(取决于上下文)命名我的自定义事件,以避免将来与其他库发生任何可能的冲突。

prefix:event.namespace
appname:widgetname:event.namespace
libraryname:widgetname:event.namespace
于 2012-11-13T22:33:03.033 回答