您可能不需要插件来执行此操作。首先,DOM 本身完全是事件驱动的。您可以使用事件委托来侦听根节点上的所有事件(jQuery live 使用的技术)。要处理可能与 DOM 无关的自定义事件,您可以使用普通的旧 JavaScript 对象来完成这项工作。我写了一个博客文章 http://vombat.tumblr.com/post/425704473/eventbus-with-mootools关于仅用一行代码在 MooTools 中创建中央事件调度程序。
var EventBus = new Class({Implements: Events});
在 jQuery 中也同样容易做到。使用常规 JavaScript 对象作为所有事件的中央代理。任何客户端对象都可以发布和订阅该对象上的事件。看这个相关question https://stackoverflow.com/questions/2625122/using-class-object-mootools-style-events-in-jquery.
var EventManager = {
subscribe: function(event, fn) {
$(this).bind(event, fn);
},
unsubscribe: function(event, fn) {
$(this).unbind(event, fn);
},
publish: function(event) {
$(this).trigger(event);
}
};
// Your code can publish and subscribe to events as:
EventManager.subscribe("tabClicked", function() {
// do something
});
EventManager.publish("tabClicked");
EventManager.unsubscribe("tabClicked");
或者,如果您不关心公开 jQuery,那么只需使用一个空对象并调用bind
and trigger
直接在 jQuery 包装的对象上。
var EventManager = {};
$(EventManager).bind("tabClicked", function() {
// do something
});
$(EventManager).trigger("tabClicked");
$(EventManager).unbind("tabClicked");
包装器只是为了隐藏底层 jQuery 库,以便您可以在以后根据需要替换实现。
这基本上是发布/订阅 http://en.wikipedia.org/wiki/Publish/subscribe or the 观察者模式 http://en.wikipedia.org/wiki/Observer_pattern,一些很好的例子是 Cocoa 的NS通知中心 http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSNotificationCenter_Class/Reference/Reference.html class, EventBus http://www.dossier-andreas.net/software_architecture/eventbus.html由 Ray Ryan 在 GWT 社区和其他几个社区中推广的模式。