【问题标题】:window.postmessage() to communicate between applications in different tabswindow.postmessage() 在不同选项卡中的应用程序之间进行通信
【发布时间】:2014-08-12 18:10:41
【问题描述】:

是否有机会使用 window.postmessage() 在同一浏览器的不同选项卡中的两个不同应用程序之间进行通信?

我知道您可以在应用程序和 iFrame 之间执行此操作,但是不同的选项卡呢?

更新:

案例场景:

  1. 用户在一个选项卡中播放来自 vk.com 的音频

  2. 用户开始在另一个标签中播放来自 youtube.com 的视频

  3. youtube.com 向 vk.com 发送 postmessage() 视频开始播放

  4. vk.com 使音频静音

谢谢

【问题讨论】:

标签: javascript cross-domain cross-platform postmessage


【解决方案1】:

如果您使用加载在 iFrame 中的“中间页面”,则可以做到这一点。

(理论上的)解决方案使用两种不同的页面间通信方法:

  • window.postMessage()
  • localStoragesessionStorage - 请参阅 this guide 了解其工作原理;该技术涉及在一个 iFrame 中设置值,并在另一个 iFrame 中侦听事件。

“中间页面”充当代理,将消息事件转换为本地存储事件,反之亦然。如果您在两个页面的 iFrame 中加载此“中间页面”,那么您在一个选项卡中发布的任何消息都会在另一个选项卡中弹出:

[Tab 1] --(postMessage)--> [iFrame 1]
                                |
                          (localStorage)
                                |
                                v
                           [iFrame 2] --(postMessage)--> [Tab 2]

如果其中一个选项卡与中间页面位于同一域(此处显示为 Tab 2),则可以简化(不影响其他选项卡的设置)。

[Tab 1] --(postMessage)--> [iFrame 1]
                                |
                          (localStorage)
                                |
                                v
                             [Tab 2]

【讨论】:

  • 为什么还要有 iframe?为什么不直接在选项卡 1 和选项卡 2 中使用 localStorage?
  • 问题是关于两个不同域上的两个选项卡进行通信 - localStorage 对于每个域都是独立的,因此至少一个选项卡需要包含 iframe,以便它具有从域加载的一些内容和其他人一样。
  • @cloudfeet 你能解释一下如何实现它吗?我正在尝试像您的流程一样实施它,但没有成功。 (我说的是“中间页面”的概念)
  • @Jumpa:每个主机页面都在 iFrame 中加载了相同的中间页面。为了广播,主机页面使用iFrame.contentWindow.sendMessage(...) 将数据发送到中间页面。当中间页面收到“消息”事件时,它使用sessionStorage.setItem(...) 将消息数据写入本地存储。这会导致中间页面的所有其他副本接收“存储”事件。当中间页面获得“存储”事件时,它使用parent.postMessage(...) 将数据发送到其主机页面。然后所有其他主机页面都会收到包含广播数据的“消息”事件。
  • @cloudfeet 是否可以仅使用 window.postMessage 发送数据。一个选项卡使用 window.postMessage 发送消息,另一个选项卡将通过侦听该特定来源的事件来接收。实际上理论上我认为这是可能的,但不知何故我无法听到这个事件
猜你喜欢
  • 2010-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-26
相关资源
最近更新 更多