【问题标题】:communication between two iframe children using postMessage使用 postMessage 的两个 iframe 子级之间的通信
【发布时间】:2012-11-27 09:52:58
【问题描述】:

我有一些嵌入代码,用户可以将它们放在他们的网站上。它在页面上创建两个子 iframe。我想让那些孩子能够交流。

我正在使用 javascript 的 window.postMessage https://developer.mozilla.org/en-US/docs/DOM/window.postMessage

由于两个 iframe 子级无法直接通信,因此我将父级用作消息的中继。但是,由于它是可嵌入代码,因此父级可以位于不同的域中。

当所有三个(父母和两个孩子)都在同一个域上时,这很容易,我可以通过安全检查检查 e.origin 是我自己的网站

# coffeescript
# host = "http://www.mysite.com"
host = "http://localhost"

receive_message = (e) ->
  console.log("received message from " + e.origin + ": " + e.data)
  return if e.origin != host

  if e.data == "show"
    ...
  else if e.data == "hide"
    ...

window.addEventListener("message", receive_message, false)

当父母可以在任何域上时,检查来源的优雅方法是什么?

什么是允许调试源可以是本地主机的脚本的好方法?

如果有非破坏性/更改消息正在传递,仅检查数据参数是否足够?

谢谢!

【问题讨论】:

    标签: javascript iframe postmessage


    【解决方案1】:

    为什么说子iframe不能直接通信?事实上,他们可以。您可以在子 iframe 中执行的操作是使用 window.parent 属性获取对父窗口的引用,然后使用父窗口的 frames 属性获取对所有子 iframe 的引用(frames 属性为您提供一个数组此类参考)。之后,您可以在每个引用上使用postMessage,并在 postMessage 调用中设置所需的来源限制,这样您就可以确定只有正确的 iframe 才能收到消息。

    请注意,即使所有三个窗口(iframe1、父窗口和 iframe2)都在不同的域上,这也可以工作,因为 iframe1 没有对父窗口做任何事情(这会违反 SOP),它只是获取对嵌套 iframe 的引用.

    链接:

    https://developer.mozilla.org/en-US/docs/DOM/window.parent

    https://developer.mozilla.org/en-US/docs/DOM/window.frames

    【讨论】:

    • 哇——你是对的!不敢相信我错过了这个,不知道孩子 iframe 可以交流。效果很好,感谢您的帮助!
    • @IvanZuzak,(iframe1, parent window and iframe2) 位于不同的域上。当我在 iframe1 的代码中使用 parent.frames[1].postMessage() 时,如何确保 iframe2 已加载。因为如果iframe2 没有加载,调用 postMessage() 会报错
    • @wengeezhang 我不认为你可以。您只能发送消息和接收消息。因此,您可以尝试发送消息,如果您在一段时间内未收到响应,则可以断定接收者尚未准备好接收它,然后重试。例如,当您发送消息时,iframe2 可能正在加载,并且尚未设置所需的处理程序。很久以前,我在一个试图为你处理这些事情的图书馆工作:github.com/izuzak/pmrpc
    猜你喜欢
    • 2011-10-01
    • 2019-09-29
    • 1970-01-01
    • 2017-04-20
    • 1970-01-01
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 2018-06-05
    相关资源
    最近更新 更多