【问题标题】:Is it OK to use 'window' as an event bus in jQuery?可以在 jQuery 中使用“窗口”作为事件总线吗?
【发布时间】:2013-02-07 03:26:14
【问题描述】:

我一直在使用 jQuery 的事件方法,并使用以下代码构建了一个简单的事件总线:

$(window).on('test:event', function (event, data) {
    console.log('Saw a test event: event=%o, data=%o', event, data);
});

$(window).trigger('test:event', {test_data: 'foo'});

我的问题是,使用“窗口”来管理事件有什么问题吗?

【问题讨论】:

    标签: jquery


    【解决方案1】:

    是的,这是在 DOM 冒泡上下文之外使用自定义 jQuery 事件的强大功能的好方法。但它也可以通过使用空对象 {} 而不是窗口来更有效地完成(无需查询 DOM,因为这会提高性能并且与要求无关我假设)。 p>

    Ben Alman 写了一个很棒的jQuery plugin 以这种方式管理事件,它避开了一些不相关的jQuery事件元素,同时使用相同的原理来实现轻量级Publish / Subscribe pattern(监听并触发由字符串定义的事件,使用之间传递的可选额外任意数据)。

    【讨论】:

    • 查询 DOM 的费用正是我所担心的。我没有考虑过使用空对象。我一定会看看那个插件。
    • 会使用一个空对象维护一个单一的位置来跟踪事件吗?我的期望是它每次都会创建一个新对象,因此 .on() 将监听一个空对象,但 .trigger() 将附加到另一个空对象。
    • 如果您连续引用同一个空对象的同一个 jQuery 选择,则不会。这就是示例使用闭包来保持o 的引用指向$({}) 的原因,所有事件都在其上被触发、侦听和解除绑定。您的示例不一定需要关闭 - 您只需要保持相同的引用而不是每次都创建新的 jQuery 选择:var eventBus = $({}); eventBus.on('some:thing', function(){…}); eventBus.trigger('some:thing', {foo:bar}) 等...
    • 对。在我询问后大约 30 秒,我注意到在 jquery-tiny-pubsub 插件中。 :) 谢谢!
    • 很高兴能帮上忙!找出 DOM 关系之外的高级事件模式确实改变了我看待 JS 编程的方式——让我了解了整个代码设计模式。
    猜你喜欢
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多