Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/417.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我可以使用window.postMessage进行同步跨域通信吗?_Javascript_Html_Cross Domain_Postmessage - Fatal编程技术网

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

Javascript 我可以使用window.postMessage进行同步跨域通信吗?,javascript,html,cross-domain,postmessage,Javascript,Html,Cross Domain,Postmessage,我正在考虑直接使用跨域通信 如果我这样做: 父帧中的postMessage() 加载iframe window.addEventListener(“消息”,回调,false)从子iframe 加载iframe之前发布的消息何时执行?他们保证会被处决吗?有时间保证吗 我想从顶部帧传递一个参数,该参数会影响子帧的初始化。postMessage()函数是异步的,这意味着它将立即返回。所以你不能和它进行同步通信 在您的示例中,已发布的消息将消失在空白中,因为在执行postMessage()函数时没有消息

我正在考虑直接使用跨域通信

如果我这样做:

  • 父帧中的
    postMessage()
  • 加载iframe
  • window.addEventListener(“消息”,回调,false)从子iframe
  • 加载iframe之前发布的消息何时执行?他们保证会被处决吗?有时间保证吗

    我想从顶部帧传递一个参数,该参数会影响子帧的初始化。

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

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

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

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

    在父窗口中:

  • 加载iframe(这也是异步的)
  • 设置消息侦听器
  • 将消息发布到iframe(仅在此处尝试)
  • 等待更多消息
  • 在iframe中:

  • 设置消息侦听器
  • 将消息发布到父窗口(仅在此处尝试)
  • 等待更多消息
  • 谁收到对方的第一条信息,谁就开始真正的交流


    根据我的经验,从父级到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');
    }