如何进行跨域postMessage?

Sco*_*son 8 javascript html5 postmessage cross-domain

postMessage的文档意味着可以进行跨域消息传递.然而:

// When the popup has fully loaded, if not blocked by a popup blocker
Run Code Online (Sandbox Code Playgroud)

这不是一个非常清楚的说明如何实际做到这一点.

想象一下两个网站:

  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');
}
Run Code Online (Sandbox Code Playgroud)

并且,在孩子:

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

window.opener.postMessage('Ready!', 'http://qc-a.nfshost.com');
Run Code Online (Sandbox Code Playgroud)

一切都无济于事.

救命?

Anh*_*Ngo 8

目前,我看到两个问题.代码中的轻微错误和超时问题.

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

2)使用超时,您可以将子窗口postMessage设置为父窗口.然后父窗口将知道孩子何时准备好.

  • 简而言之,我是个白痴.用`window`替换`document`,并通过`window.opener.postMessage`替换了ready回调.谢谢! (5认同)