我正在考虑直接使用window.postMessage进行跨域通信。
如果我这样做:
postMessage()
window.addEventListener("message", callback, false);
在加载iframe之前我发布的消息何时会被执行?他们保证会被执行吗?有定时保证吗?
我想从顶部框架传递一个影响子框架初始化的参数。
答案 0 :(得分:7)
postMessage()函数是异步的,这意味着它将立即返回。所以你不能与它进行同步通信。
在您的示例中,发布的消息将在void中消失,因为在执行postMessage()函数时没有消息事件的侦听器。
如果您先加载iframe并在之后调用postMessage(),那么可能会出现计时问题。 (根据我的经验,没有,父代码总是先执行,但我不确定这一点。)
以下是我不知道iframe何时准备好的问题的解决方案。
在父窗口中:
在iframe中:
从对方收到第一条消息然后开始真正的通信。
根据我的经验,从父级到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');
}