2014-03-05 27 views
9

我在Heroku上一场比赛,我现在正在努力使其在Facebook的帆布工作,但是,虽然它在Firefox中起作用,但在Chrome和IE中却没有。无法执行对“DOMWindow”的postMessage“:提供不匹配收件人窗口的起源目标来源(“空”)

1E示出了与按钮警告,点击该按钮时,它显示的内容。

在Chrome中,我得到这个错误:

Failed to execute 'postMessage' on 'DOMWindow': The target origin provided ('https://game.herokuapp.com') does not match the recipient window's origin ('null'). 

有什么不对?

回答

24

确保您正在加载的目标窗口是/ FB正在发布消息。大多数时候,我得到这个错误是当我发送消息的隐藏的iframe无法加载。

+4

“你/ FB是发布消息的目标窗口被载入” 我新的Web开发。这是什么意思? –

+7

@PrakharMohanSrivastava好问题 - 语法使这个答案难以理解。 – jononomo

+1

我想他是说张贴到文档尚未完成加载(尚未)的窗口会导致此错误。 – doug65536

2

要检查帧是否已加载,请使用onload函数。或者把你的主要功能负荷:我推荐使用由JS创建IFRAME当负载

$('<iframe />', { 
    src: url, 
    id: 'receiver', 
    frameborder: 1, 
    load:function(){ 
    //put your code here, so that those code can be make sure to be run after the frame loaded 
    } 
    }).appendTo('body'); 
8

这可能发生的另一个原因是,如果你使用的是具有沙箱属性,allow-same-origin没有设置一个iframe例如:

// page.html 
<iframe id="f" src="http://localhost:8000/iframe.html" sandbox="allow-scripts"></iframe> 
<script type="text/javascript"> 
    var f = document.getElementById("f").contentWindow; 
    // will throw exception 
    f.postMessage("hello world!", 'http://localhost:8000'); 
</script> 

// iframe.html 
<script type="text/javascript"> 
    window.addEventListener("message", function(event) { 
     console.log(event); 
    }, false); 
</script> 

我还没有发现比其他的解决方案:

  • 添加允许-同源沙盒(不想做)
  • 使用f.postMessage("hello world!", '*');
+0

太棒了。这个解决方案对我有用! –

+0

但同时使用allow-scripts和allow-same-origin是不安全的(Firefox说:“警告:同时使用allow-scripts和allow-same-origin会使iframe沙盒属性失效。”)。与[此问题]相关(https://stackoverflow.com/questions/44565959/javascript-postmessage-to-sandboxed-iframe-why-is-recipient-window-origin-nul)。所以我认为建议使用星号,因为您不允许更改URL。 – Yeti

0

在我来说,我没有添加http//:前缀。可能值得检查。

相关问题