【问题标题】:How can I do cross-domain postMessage?如何进行跨域postMessage?
【发布时间】:2011-03-20 22:32:01
【问题描述】:

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');

一切都无济于事。

帮助?

【问题讨论】:

    标签: javascript html cross-domain postmessage


    【解决方案1】:

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

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

    2) 使用超时,您可以让子窗口 postMessage 到父窗口。然后,父窗口将知道子窗口何时准备就绪。

    【讨论】:

    • 简而言之,我是个白痴。将document 替换为window,就绪回调通过window.opener.postMessage 工作。谢谢!
    【解决方案2】:

    您正在打开窗口并依次发布消息。打开的文档无法准备好接受发布的消息。尝试延迟 postMessage 调用,直到窗口完成加载。

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

    【讨论】:

    • 对。代码中的注释提到(我知道)无法知道窗口何时准备就绪。 10 秒的超时似乎有点...... hacky。请注意,在子窗口中,我尝试执行一个 postMessage 指示准备好备份到开启者。那也失败了。想法?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 2011-12-24
    • 2013-11-22
    • 2014-01-15
    • 1970-01-01
    相关资源
    最近更新 更多