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

6
当使用Chrome开发者工具时,每个应用程序窗口(以及后台“页面”)似乎都有自己的JavaScript上下文(对象空间,执行线程),但是chrome.app.window.create的createdWindow回调显然提供了对刚刚创建的“其他”窗口的对象的直接访问。
鉴于此,我不清楚在窗口之间通信的最佳方法;例如,如果我打开第二个窗口作为对话框,当用户单击“确定”保存更改时,我应该使用postMessage、sendMessage还是仅在主窗口的对象上调用函数。我已经查看了消息传递示例,它们似乎集中在两个不同应用程序之间或应用程序与扩展之间的通信。
因此,我正在寻求一个清晰的描述一个应用程序内存和执行模型的描述。是否真的存在单独的上下文,还是只有一个对象空间和一个执行线程?在同一Chrome应用程序的窗口之间通信的最佳方法是什么?
2个回答

6

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

多个Chrome窗口并不是完全独立的。它们共享一个线程和对象空间,但每个窗口对象都是不同的。在JavaScript中,对于未限定作用域的引用,会在当前窗口中查找,因此这使得窗口看起来像是不同的对象空间-但它们实际上并不是。

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


谢谢。从您的回答中,我可以假设对“window”或“chrome”的全局(未作用域限定的)引用是基于包含<script>标签的窗口的范围,因此另一个窗口中的函数将看到它自己的窗口,而不是调用者的窗口? - James Synge
如果脚本只在一个窗口中,则这是正确的,但是脚本可以列在多个窗口中。为了确定全局上下文/窗口是什么(顺便说一句,Chrome挂在窗口上),应用以下规则:(1)如果您不在闭包中,请确定起始全局上下文是什么(即事件、回调或其他内容触发时存在哪个全局上下文),(2)如果您在闭包中,请确定创建窗口时的全局上下文是什么。 - Ben Wells
继续上面的话题,我相信实际情况比那更加复杂,因为这是 JavaScript,充满了疯狂的操作。 - Ben Wells
@BenWells 我基于你在这里的回答提出了一个后续问题 - 希望如果你有机会的话,也能为此提供一些解释... https://dev59.com/LH_aa4cB1Zd3GeqP9_Ru - Maks
chrome.app.window.create必须在后台页面中调用,还是任何窗口页面(JS)都可以调用它?我尝试从普通JavaScript中调用它,但是出现错误提示页面的URL未找到。 - Fiona
@Be,请为“多个Chrome窗口并不完全独立”提供引用证明 - Pacerier

3

你说得很对,但我的问题的重点不在于如何获取特定窗口的AppWindow实例,而是有什么最好的方法(或良好的替代方案)将信息发送到其他窗口?如果我只是进入另一个窗口并执行一个函数,它是否会像在原始窗口中运行一样运行,还是在其他窗口中运行?或者这只是一个愚蠢的问题,因为(也许?)Chrome Web应用程序只有一个Javascript执行线程? - James Synge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接