【问题标题】:How to communicate between multiple windows of the same chrome app?如何在同一个 chrome 应用的多个窗口之间进行通信?
【发布时间】:2014-01-12 23:45:45
【问题描述】:

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

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

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

【问题讨论】:

    标签: google-chrome-app


    【解决方案1】:

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

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

    然后您可以使用chrome.runtime.getBackgroundPage() 方法从任何窗口获取对背景页面上下文的引用

    【讨论】:

    • 您说的很对,但我的问题的重点不是如何获取特定窗口的 AppWindow 实例,而是发送信息的最佳方式(或好的替代方案)是什么到其他窗户?如果我只是进入另一个窗口并执行一个函数,它会像在原始窗口还是在另一个窗口中运行一样运行?或者这只是一个愚蠢的问题,因为(也许?)chrome web 应用程序实际上只有一个 Javascript 执行线程?
    【解决方案2】:

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

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

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

    【讨论】:

    • 谢谢。我可以从您的回答中假设对“window”或“chrome”的全局(无范围?)引用是基于
    • 如果脚本只在一个窗口中是这样,但是脚本可以在多个窗口中列出。要弄清楚全局上下文/窗口是什么(chrome 挂断窗口,顺便说一句),以下规则适用 (1) 如果您不在闭包中,那么原始全局上下文是什么(即当事件或回调或任何触发)和(2)如果你在一个闭包中,创建窗口时的全局上下文是什么。
    • 从上面开始,我敢肯定它实际上比这更复杂,因为这是javascript并且充满了insanity
    • @BenWells 我根据您在这里的回答提出了一个后续问题 - 如果您有机会,希望您也能对此有所了解...stackoverflow.com/questions/23819384/…
    • 必须在后台页面中调用 chrome.app.window.create 还是任何窗口页面 (JS) 都可以调用它?我尝试从普通 JavaScript 调用 a,但弹出错误提示找不到页面的 URL。
    猜你喜欢
    • 2015-08-24
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    • 2012-06-15
    • 2012-03-30
    • 2011-04-13
    相关资源
    最近更新 更多