【问题标题】:Communication between child iframes子 iframe 之间的通信
【发布时间】:2019-09-29 09:31:04
【问题描述】:

我已经构建了一个通过 iframe 嵌入的播放器。如果嵌入了两个播放器,我想在另一个开始播放时停止其中一个。所以问题是,是否可以使用postMessage 在两个子 iframe 之间进行通信,而无需拥有父级? Vimeo 正在以某种方式做到这一点。如果我嵌入了两个 vimeo 播放器,然后播放一个,然后播放另一个,第二个播放器停止第一个播放器。如何? (证明:https://jsfiddle.net/3fy14orw/2/

在我的播放器中,我使用postMessage 在播放器播放时触发父窗口上的事件。我已经确认这是有效的。我尝试使用我的实际来源以及“*”作为来源。

//in my player
window.parent.postMessage(data, "*");

其他玩家怎么知道?我试过了,

//tried adding this in my player    
window.parent.addEventListener('message', function(evt) {});

但这会引发错误。

"SecurityError: Blocked a frame with origin..."

我也尝试命名我的框架窗口,以及通过 window.parent.frames 对象访问这些窗口,但这也会引发 CORS 问题。

假设:

  • 我的玩家有相同的来源。
  • 我的播放器可以嵌入任何域,而不仅仅是我自己的域

【问题讨论】:

    标签: javascript iframe embed


    【解决方案1】:

    有点老套,但你可以在localStorage 之上建立一个沟通渠道。框架可以通过写入 localStorage 来发送消息,然后通过不断轮询 localStorage 来读取消息。

    【讨论】:

    • 你我的朋友,真是个天才。这就是 Vimeo 的实现方式。根据您的回答检查了 LocalStorage,果然他们正在设置活动状态。
    • 像魅力一样工作。不确定通过 setInterval 进行轮询会产生什么负面影响,但对我来说事情似乎很顺利。
    猜你喜欢
    • 2013-05-15
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    • 2019-11-06
    • 2012-02-27
    相关资源
    最近更新 更多