var test = { }
$(test).on("testEvent", function (){
console.log("testEvent has fired");
});
$.event.trigger("testEvent");
我正在尝试使用 jQuery 使用事件进行发布/订阅机制。我需要能够将事件附加到非 DOM 对象,并能够让它们从单个全局触发器触发。我希望上面的代码可以工作,但它没有导致测试对象的 testEvent 触发。
请注意,将有多个对象在其中订阅事件。单个 $.event.trigger 应触发所有这些事件。
请注意,此代码工作正常:
$('#someID').on("testEvent", function () {
console.log('testEvent has fired from DOM element');
})
$.event.trigger("testEvent");
经过一些研究,jQuery 1.7似乎提供了一种引入发布/订阅机制的简单方法。(在这里找到(为了具有发布/订阅机制,可以使用以下代码:
(function ($, window, undefined) {
var topics = {};
jQuery.Topic = function (id) {
var callbacks, method, topic = id && topics[id];
if (!topic) {
callbacks = jQuery.Callbacks();
topic = {
publish: callbacks.fire,
subscribe: callbacks.add,
unsubscribe: callbacks.remove
};
if (id) {
topics[id] = topic;
}
}
return topic;
};
})
为了订阅事件,需要完成以下操作:
$.Topic("message").subscribe(function () {
console.log("a publish has occurred");
});
为了发布消息,请执行以下操作:
$.Topic( "message" ).publish(data);
"消息"是事件名称。data 参数包含要传递给订阅者的任何信息。
要取消订阅,您必须传递已订阅的函数:
$.Topic( "message" ).unsubscribe(funcSubscribedToBefore);
在现代浏览器中(如果我读过 Underscore 的源代码.js对(允许您将事件绑定到非 DOM 对象。 否则,您将不得不使用类似 underscore 的 .bind 函数。 因此,这取决于您需要支持的浏览器。
编辑:
好吧,没关系,我在想下划线中的绑定.js与骨干相同。 显然,Backbone有自己的事件模块,可以执行事件绑定。
将事件绑定到下划线/主干中的动态对象
我最近使用了Ben Alman方法,效果很好!
/* jQuery Tiny Pub/Sub - v0.7 - 10/27/2011
* http://benalman.com/
* Copyright (c) 2011 "Cowboy" Ben Alman; Licensed MIT, GPL */
(function ($) {
var o = $({});
$.subscribe = function () {
o.on.apply(o, arguments);
};
$.unsubscribe = function () {
o.off.apply(o, arguments);
};
$.publish = function () {
o.trigger.apply(o, arguments);
};
}(jQuery));
用法:
$.subscribe('eventName', function (event) {
console.log(event.value);
});
$.publish({ type: 'eventName', value: 'hello world' });
有关详细信息,请参阅 https://gist.github.com/addyosmani/1321768。