2010-07-26 67 views
7

postMessage的文档意味着跨域消息传递是可能的。但是:我该如何做跨域postMessage?

// When the popup has fully loaded, if not blocked by a popup blocker 

这不是很清楚的记的如何真正做到这一点。

想象一下两个网站:

  1. [家长]托管在qc-a.nfshost.com
  2. (孩子)托管在qc-b.quadhome.com

在父:

document.addEventListener('message', function(e) { 
    alert('Parent got (from ' + e.origin + '): ' + e.data); 

    e.source.postMessage('Round-tripped!', 'http://qc-b.quadhome.com'); 
}, false); 

function go() { 
    var w = window.open('http://qc-b.quadhome.com', 'test'); 

    /* This doesn't work because same-origin policy prevents knowing when 
    the opened window is ready. */ 

    w.postMessage('Vain attempt.', 'http://qc-b.quadhome.com'); 
} 

而且,在小孩:

document.addEventListener('message', function(e) { 
    alert('Child got (from ' + e.origin + '): ' + e.data); 
}, false); 

window.opener.postMessage('Ready!', 'http://qc-a.nfshost.com'); 

全部无济于事。

帮助?

回答

8

目前,我看到两个问题。代码中的小错误和超时问题。

1)我在你的代码中看到的错误是你正在使用document.addEventListener。我认为正确的是window.addEventListener。它在postMessage页面的示例中。

2)超时,你可以有子窗口postMessage父。父窗口然后会知道孩子什么时候准备好了。

+4

总之,我是个白痴。用'window'代替'document',通过'window.opener.postMessage'完成回调。谢谢! – 2010-07-26 07:45:40

+0

适应我们最好的:) – 2010-07-26 07:47:59

0

您打开窗口&将消息发送给对方。打开的文档无法接收邮件信息。尝试延迟postMessage调用,直到窗口完成加载。

测试此方法的一个非常简单的方法是将w.postMessage()包装在setTimeout(10秒钟)中,并查看文档准备就绪后是否可以发布它。

+1

没错。代码中的评论提到,当窗口准备就绪时,我无法知道(我知道)。 10秒的超时时间似乎有点...哈克。 注意在子窗口中,我尝试做一个postMessage指示准备工作返回到开启者。这也失败了。思考? – 2010-07-26 06:58:55