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

问题描述 投票:5回答:2

我正在考虑直接将window.postMessage用于跨域通信。

如果我这样做:

  1. postMessage()来自父框架
  2. 加载iframe
  3. 来自子iframe的[window.addEventListener("message", callback, false);

我在加载iframe之前发布的消息何时执行?是否保证将其全部执行?有时间保证吗?

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

javascript html5 cross-domain postmessage
2个回答
7
投票

postMessage()函数是异步的,这意味着它将立即返回。因此您不能使用它进行同步通信。

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

如果您先加载iframe,然后再调用postMessage(),则可能存在计时问题。 (从我的经验来看,没有,父代码始终优先执行,但是我不确定这一点。)

下面是我不完全知道iframe何时准备就绪的问题的解决方案。

在父窗口中:

  1. 加载iframe(这也是异步的)
  2. 设置消息侦听器
  3. 将消息发布到iframe(只需在此处尝试)
  4. 等待更多消息出现>
  5. 在iframe中:

  1. 设置消息侦听器
  2. 将消息发布到父窗口(只需在此处尝试)
  3. 等待更多消息出现>
  4. 谁从对方收到第一条消息,然后开始真实的通信。

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

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

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

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.