无法在'DOMWindow'上执行'postMessage':提供的目标原点与收件人窗口的原点('null')不匹配

时间:2014-03-05 10:01:47

标签: javascript facebook heroku

我在heroku有一款游戏,现在我试图让它在Facebook画布上运行,但是,虽然它适用于Firefox,但在Chrome和IE中却没有。

IE显示带按钮的警告,单击按钮时会显示内容。

在chrome中,我收到此错误:

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

出了什么问题?

8 个答案:

答案 0 :(得分:34)

确保已加载/ f / FB正在发布的目标窗口消息。大部分时间我收到此错误的是当我发送消息时隐藏的iframe无法加载。

答案 1 :(得分:19)

可能发生这种情况的另一个原因是,如果您使用的是具有沙盒属性且未设置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>

我没有找到解决方案以外的解决方案:

  • 将allow-same-origin添加到沙箱中(不想这样做)
  • 使用f.postMessage("hello world!", '*');

答案 2 :(得分: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');

答案 3 :(得分:1)

在我的情况下,我没有添加http://前缀。可能值得检查。

答案 4 :(得分:0)

我的问题是我从一开始就完全将播放器形象化,但是我使用了iframe而不是包装器div。

答案 5 :(得分:0)

在我的情况下,SSL证书对于iframe域无效,因此请确保您尝试向其发送消息的iframe URL不会出现任何问题(以防您通过https加载iframe)。

答案 6 :(得分:0)

就我而言,我尝试在加载时将消息从 Salesforce Marketing Cloud 自定义活动(域 1)传递到 Heroku(域 2)。

当我从传递消息的位置加载原始 html 页面时,控制台中出现错误。

阅读很多博客后我注意到的问题是,接收器页面尚未加载。 即

<块引用>

我需要从接收方页面而不是发送方页面进行调试。

简单但很高兴能帮助到任何人。

答案 7 :(得分:0)

如果您尝试创建没有 videoId 的播放器,这也会可靠地发生。好像不支持。