可以在 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 中使用“窗口”作为事件总线吗?的主要内容,如果未能解决你的问题,请参考以下文章