我可以与window.postMessage进行同步跨域通信吗?

时间:2012-01-30 10:49:02

标签: javascript html5 cross-domain postmessage

我正在考虑直接使用window.postMessage进行跨域通信。

如果我这样做:

    来自父框架的
  1. postMessage()
  2. 加载iframe
  3. 来自孩子iframe的
  4. window.addEventListener("message", callback, false);
  5. 在加载iframe之前我发布的消息何时会被执行?他们保证会被执行吗?有定时保证吗?

    我想从顶部框架传递一个影响子框架初始化的参数。

2 个答案:

答案 0 :(得分:7)

postMessage()函数是异步的,这意味着它将立即返回。所以你不能与它进行同步通信。

在您的示例中,发布的消息将在void中消失,因为在执行postMessage()函数时没有消息事件的侦听器。

如果您先加载iframe并在之后调用postMessage(),那么可能会出现计时问题。 (根据我的经验,没有,父代码总是先执行,但我不确定这一点。)

以下是我不知道iframe何时准备好的问题的解决方案。

在父窗口中:

  1. 加载iframe(这也是异步的)
  2. 设置消息监听器
  3. 将消息发布到iframe(只是在这里尝试)
  4. 等待更多留言
  5. 在iframe中:

    1. 设置消息监听器
    2. 将消息发布到父窗口(只是在这里尝试)
    3. 等待更多留言
    4. 从对方收到第一条消息然后开始真正的通信。

      根据我的经验,从父级到iframe的消息总是丢失,因此当父级从iframe接收消息时通信开始。但是在这个设置中,首先开始哪一个并不重要。

答案 1 :(得分:0)

要将第一条消息从父窗口发送到iframe,您只能在iframe加载后才能执行,而在此之前,您甚至无法将消息从子窗口发送到父窗口。 因此,为了这样做,请为iframe提供一个onload处理程序,以便您可以使用postmessge()。 同样考虑以下代码。

ifrm.setAttribute('src','www.yoururl.com'));
document.body.appendChild(ifrm);
ifrm.onload = function() {
   this.contentWindow.postMessage(dataObject,'targetWindow');
}