如何在同一个Chrome应用程序的多个窗口之间进行通信?

时间:2013-12-24 19:25:50

标签: google-chrome-app

使用chrome开发人员工具时,似乎每个应用程序窗口(以及背景“页面”)都有自己的javascript上下文(对象空间,执行线程),以及chrome.app.window的createdWindow回调。 create显然可以直接访问刚刚创建的“其他”窗口的对象。

鉴于此,我不清楚窗口之间通信的最佳方式;例如如果我打开第二个窗口作为对话框,当用户单击“确定”保存更改时,我应该使用postMessage,sendMessage还是只调用主窗口中对象的函数。我查看了消息传递示例,他们似乎专注于两个不同应用之间或应用和扩展之间的通信。

所以,我正在寻求一个应用程序内的内存和执行模型的清晰描述。是否有单独的上下文,或者它只是一个对象空间,有一个执行线程?在同一个Chrome应用程序的窗口之间进行通信的最佳方式是什么?

2 个答案:

答案 0 :(得分:4)

这是詹姆斯的一个很好的问题!

多个镀铬窗口并非完全分开。它们共享一个线程和对象空间,但每个窗口对象都不同。在javascript中,在当前窗口中查找对事物的未编码引用,因此这使得窗口看起来是不同的对象空间 - 但它们实际上并非如此。

因此,你可以进入另一个窗口并在那里执行一个函数,或者以其他方式操作状态(例如,将另一个窗口上的变量设置为当前窗口中的一个函数),这是可以接受和支持的。

答案 1 :(得分:2)

您可能会发现chrome.app.window.getAll()chrome.app.window.get()方法很有用。然而,它们是Chrome 33的新手,尚未进入稳定的渠道。

作为替代方法,您可以在后台页面上下文中保存一组打开的AppWindow对象。

然后,您可以使用chrome.runtime.getBackgroundPage()方法

从任何窗口获取对背景页面上下文的引用