jQuery EventEmitter 是一个简易的 Observer 模式实现,短短的几行程式码就实作出对物件加入自订事件的机制。
事实上 jQuery EventEmitter 只是把 jQuery 内建的 event 机制再加上一层包装而已,实现方式如下:
(function(jQuery) { jQuery.eventEmitter = { _JQInit: function() { this._JQ = jQuery(this); }, emit: function(evt, data) { !this._JQ && this._JQInit(); this._JQ.trigger(evt, data); }, once: function(evt, handler) { !this._JQ && this._JQInit(); this._JQ.one(evt, handler); }, on: function(evt, handler) { !this._JQ && this._JQInit(); this._JQ.bind(evt, handler); }, off: function(evt, handler) { !this._JQ && this._JQInit(); this._JQ.unbind(evt, handler); } }; }(jQuery));
因为 jQuery 也可以包装一个非 DOM 的纯物件,所以程式中透过 _JQInit 动态生成一个以 jQuery 包装起来的 _JQ 物件。
然后在 _JQ 物件上,把 emit/once/on/off 等方法 delegate 到 jQuery 原来的 trigger/one/bind/unbind 方法上,就完成了整个机制。
然后我们就可以这样用了 (範例直接引用原文) :
function App() { // do stuff} jQuery.extend(App.prototype, jQuery.eventEmitter); var myApp = new App(); // myApp supports events! myApp.on('someEvent', function() { alert('someEvent!');});myApp.emit('someEvent'); // 'someEvent' alerted
主要的用法是先让物件继承 jQuery.eventEmitter ,这样一来就可以在我们自行建立的物件上使用事件机制了。