繁体   English   中英

如何进行跨域postMessage?

[英]How can I do cross-domain postMessage?

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

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

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

想象一下两个网站:

  1. [家长]在qc-a.nfshost.comqc-a.nfshost.com
  2. [儿童]在qc-b.quadhome.comqc-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');

一切都无济于事。

救命?

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

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

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

您打开窗口并在彼此之后发布消息。 打开的文档无法接受发布消息。 尝试延迟postMessage调用,直到窗口加载完毕。

测试这个的一个非常简单的方法是将w.postMessage()包装在setTimeout中(持续10秒)并查看它是否可以在文档准备好时发布它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM