8

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

如果我做:

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

我在加载 iframe 之前发布的消息什么时候会执行?他们能保证被执行吗?有时间保证吗?

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

4

2 回答 2

11

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

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

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

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

在父窗口中:

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

在 iframe 中:

  1. 设置消息监听器
  2. 将消息发布到父窗口(只是在这里尝试)
  3. 等待更多消息到来

谁收到对方的第一条消息,谁就开始真正的通信。

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

于 2012-03-07T08:23:05.557 回答
1

To send the first message to the iframe from the parent window, you can only do it once the iframe is loaded and before that you can not even send the message from child to parent. So in order to do so provide a onload handler for the iframe so that you can use the postmessge(). Consider the following code for the same.

ifrm.setAttribute('src','www.yoururl.com'));
document.body.appendChild(ifrm);
ifrm.onload = function() {
   this.contentWindow.postMessage(dataObject,'targetWindow');
}
于 2019-09-27T12:39:38.343 回答