你可能不需要一个插件来完成这个任务。首先,DOM本身完全是事件驱动的。你可以使用事件委托在根节点上监听所有事件(这是jQuery live使用的一种技术)。为了处理那些可能与DOM无关的自定义事件,你可以使用一个普通的JavaScript对象来完成这项工作。我写了一篇博客文章,介绍如何使用MooTools创建一个中央事件分发器,只需一行代码。
var EventBus = new Class({Implements: Events})
在jQuery中做这个也同样容易。使用一个普通的JavaScript对象作为所有事件的中央代理。任何客户端对象都可以在此对象上发布和订阅事件。请参见这个相关的问题。
var EventManager = {
subscribe: function(event, fn) {
$(this).bind(event, fn);
},
unsubscribe: function(event, fn) {
$(this).unbind(event, fn);
},
publish: function(event) {
$(this).trigger(event);
}
};
EventManager.subscribe("tabClicked", function() {
});
EventManager.publish("tabClicked");
EventManager.unsubscribe("tabClicked");
或者如果你不介意暴露jQuery,那么只需使用一个空对象并直接在jQuery包装的对象上调用bind
和trigger
即可。
var EventManager = {};
$(EventManager).bind("tabClicked", function() {
});
$(EventManager).trigger("tabClicked");
$(EventManager).unbind("tabClicked");
这些包装器的作用只是为了隐藏底层的jQuery库,以便在需要时可以替换实现。
基本上这就是发布/订阅或观察者模式,一些很好的例子包括Cocoa的NSNotificationCenter类、Ray Ryan在GWT社区中流行的EventBus模式以及其他几种。