Phi*_*ton 9 jquery dom jquery-ui jquery-plugins twitter-bootstrap
jQuery事件内置了命名空间概念,可以轻松,安全地解除您添加的事件的绑定.
但是,当不同的插件触发相同的基本事件时,这些命名空间不会阻止冲突.例如,如果插件A触发hide.foo事件而插件B触发hide.bar事件,则任何侦听hide事件的处理程序将被调用两次,即使使用命名空间也是如此.
这可能会导致问题时,插件触发喜欢过于通用名称open,close,show,hide,start,end,等,但这么多的插件在那里(甚至像jQueryUI的和引导大型图书馆的)触发没有第二个层次的命名空间,这些一般事件.
所以这是我的问题.似乎第二级命名空间是谨慎的,以区分您的事件与其他插件和标准DOM事件.约定可能类似于namespace:eventName或者namespace:eventName.secondaryNamespace使用标准的jQuery点表示法.
但似乎没有人这样做,所以我想知道是否有一些令人信服的理由不这样做.有人知道吗?
更新:
为了提供一个更具体的例子,假设我正在使用插件A,当用户将鼠标悬停在某些文本上时,它会触发工具提示上的事件show和 hide事件.由于事件的传播,我的DOM是不断变化的,我决定我的事件监听器绑定到document元素赶上show和hide事件从所有的提示.
然后,几个星期后,我将插件B添加到我的应用程序,这也会hide在用户解除警报消息后触发事件.现在突然之间我的工具提示代码将被调用的次数超出我的预期,因为工具提示和警报消息插件都触发了具有相同名称的事件.
事实证明,我特别提到的两个库(jQueryUI 和 Bootstrap)要么已经或正在计划为其自定义事件添加前缀。
以下是 jQueryUI 在其自定义_trigger方法中所做的事情:
event.type = ( type === this.widgetEventPrefix ? type : this.widgetEventPrefix + type ).toLowerCase();
Run Code Online (Sandbox Code Playgroud)
this.widgetEventPrefix这允许您通过任何包含的小部件或您使用小部件工厂制作的小部件来定义自己的前缀。
Bootstrap 尚未实现前缀,但计划在下一个主要版本 (3.0.0) 中实现。
以下是 @fat 在Github 问题中所说的话:
将来我们可能会使用 bootstrap 命名所有内容(数据属性和事件 - 但这将是 3.0.0 的事情,因为它破坏了向后兼容性)
这是他回应我的问题的推文。
--
对于我来说,我决定使用以下模式之一命名我的自定义事件(取决于上下文),以避免将来与其他库发生任何可能的冲突。
prefix:event.namespace
appname:widgetname:event.namespace
libraryname:widgetname:event.namespace
Run Code Online (Sandbox Code Playgroud)