可以在 jQuery 中使用“窗口”作为事件总线吗?

Posted

技术标签:

【中文标题】可以在 jQuery 中使用“窗口”作为事件总线吗?【英文标题】:Is it OK to use 'window' as an event bus in 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');

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

【问题讨论】:

【参考方案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 编程的方式——让我了解了整个代码设计模式。

以上是关于可以在 jQuery 中使用“窗口”作为事件总线吗?的主要内容,如果未能解决你的问题,请参考以下文章

我可以通过使用服务总线会话插入事件中心来避免重复事件吗?

用JS或者jQuery可以监听浏览器窗口的变化吗

检测何时使用 JavaScript 调整窗口大小?

RxJava 作为 Android 项目中的事件总线 - 从总线中删除事件

Vue中 事件总线(eventBus)使用

在主干js中有“onDomRefresh”事件(在Marionette中)有什么替代方案吗?