$ .event.trigger不在非DOM对象中触发

crv*_*crv 7 jquery event-handling

var test = { }
$(test).on("testEvent", function (){
    console.log("testEvent has fired");
});
$.event.trigger("testEvent");
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用jQuery来使用事件来执行发布/订阅机制.我需要能够将事件附加到非DOM对象,并且能够从一个全局触发器中激活它们.我希望上面的代码可以工作,但它不会导致测试对象的testEvent触发.

请注意,将有多个对象在其中订阅事件.单个$ .event.trigger应该触发所有这些事件.

请注意,此代码工作正常:

$('#someID').on("testEvent", function () {
console.log('testEvent has fired from DOM element');
})
$.event.trigger("testEvent");
Run Code Online (Sandbox Code Playgroud)

crv*_*crv 8

在做了一些研究后,似乎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;
    };
})
Run Code Online (Sandbox Code Playgroud)

要订阅活动,请执行以下操作:

$.Topic("message").subscribe(function () {
    console.log("a publish has occurred");
});
Run Code Online (Sandbox Code Playgroud)

为了发布消息,完成以下操作:

$.Topic( "message" ).publish(data);
Run Code Online (Sandbox Code Playgroud)

"消息"是事件名称.data参数包含要传递给订阅者的任何信息.

要取消订阅,您必须传递已订阅的功能:

$.Topic( "message" ).unsubscribe(funcSubscribedToBefore);
Run Code Online (Sandbox Code Playgroud)