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


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。

相关内容

  • 没有找到相关文章

最新更新