你如何使用跨域的window.postMessage?

这似乎是window.postMessage的要点是允许安全沟通不同域之间托pipe的窗口/框架,但它似乎并不允许在Chrome中。

这是一个场景:

  1. 在域A的页面上embedded<iframe>(在域B *上带有src
  2. <iframe>最终是一个<script>标签,在其结尾执行…
  3. 我打电话给window.postMessage( some_datapage_on_A

<iframe>绝对是在域B的上下文中,并且我已经确认在<iframe>中embedded的javascript执行正确并且调用postMessage的正确值。

我在Chrome中收到此错误消息:

无法发送消息给A。 收件人有原件B.

下面是在A上的页面上注册一个消息事件监听器的代码:

 window.addEventListener( "message", function (event) { // Do something }, false); 

我也试着调用window.postMessage(some_data, '*') ,但是所有这些都是压制错误。

我只是在这里忽略了一点,是window.postMessage(…)不是为了这个? 还是我只是做了可怕的错误?

* MIMEtypes的文本/ HTML,它必须保持。

以下是一个适用于Chrome 5.0.375.125的示例。

页面B(iframe内容):

 <html> <head></head> <body> <script> top.postMessage('hello', 'A'); </script> </body> </html> 

注意在这里使用top.postMessageparent.postMessage而不是window.postMessage

页面A:

 <html> <head></head> <body> <iframe src="B"></iframe> <script> window.addEventListener( "message", function (e) { if(e.origin !== 'B'){ return; } alert(e.data); }, false); </script> </body> </html> 

A和B必须是http://domain.com

编辑:

从另外一个问题看来,域(A和B在这里)必须有一个/ postMessage才能正常工作。

加载后,您应该将消息从帧发送到父级。

框架脚本:

 $(document).ready(function() { window.parent.postMessage("I'm loaded", "*"); }); 

然后在家长那里听:

 function listenMessage(msg) { alert(msg); } if (window.addEventListener) { window.addEventListener("message", listenMessage, false); } else { window.attachEvent("onmessage", listenMessage); } 

使用此链接获取更多信息: http : //en.wikipedia.org/wiki/Web_Messaging

也许你尝试从mydomain.com发送你的数据到www.mydomain.com或者反向,注意你错过了“www”。 http://mydomain.com和http://www.mydomain.com是不同的域到JavaScript。;