我正在尝试在网站和谷歌浏览器扩展之间实现发布/订阅模式。到目前为止,我的大部分实验都是使用 jQuery,因为它具有强大的绑定/触发语法,但我运气不佳。
背景:我正在使用一个开源的、基于 Ruby/Rails 的 Pomodoro 技术实现。我修改了站点的代码以使用 jQuery 的 $.trigger 语法公开其活动,以发布计时器会话开始和计时器会话结束的可观察事件。只要我可以将执行跟踪到 jQuery 事件代码中,这些触发器就可以工作。因此,该网站是几个相关事件的发布者。
我通过加载 jquery 并使用 .bind() 语法绑定到站点发布的自定义事件,在 google chrome 扩展中实现了事务的侦听器/订阅者端。该扩展正在为该站点加载,并为该站点的 url 中的所有路径设置了权限。
从发布端我尝试 $.event.trigger() 和 $(document).trigger() 尽可能通用,在订阅端我尝试绑定到几个相关元素,最普遍的是$(文档).bind()
当我在执行扩展中的绑定调用后通过暂停执行来观察自定义事件绑定并分析 console.dir($(document).data('events')); 的结果时 我在列表中看到我尝试订阅的自定义事件。
但是,当我分析 console.dir($(document).data('events')); 的结果时 就在网站端触发自定义事件之前,必要的事件处理程序不会出现在列表中。
我是否遗漏了一些明显的东西应该如何工作?
ps 我应该注意,如果我直接绑定到触发更改的元素上的“click”事件,我的扩展代码可以完美运行,但是站点的 DOM 在执行过程中会发生变化,所以绑定在不久之后就会中断,所以我希望某种发布-订阅机制可能更明智。
编辑
正如我在回复@ChrisNZL 的回答中指出的那样,我尝试了 .live() 而不是 .bind() 并看到了相同的行为。