Ответ 1
Убедитесь, что целевое окно, в которое вы (или Facebook) публикуете сообщение, завершило загрузку. В большинстве случаев я получал эту ошибку, когда не загружался iframe, на который я отправлял сообщения.
У меня есть игра в 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 origin ('null').
Что не так?
Убедитесь, что целевое окно, в которое вы (или Facebook) публикуете сообщение, завершило загрузку. В большинстве случаев я получал эту ошибку, когда не загружался iframe, на который я отправлял сообщения.
Другая причина, по которой это может произойти, - это использовать iframe с атрибутом песочницы и allow-same-origin
не установлен, например:
// 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!", '*');
Чтобы проверить, загружен ли кадр, используйте функцию onload. Или поставьте свою основную функцию в нагрузку: я рекомендую использовать нагрузку при создании iframe с помощью js
$('<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');
В моем случае я не добавил префикс http://
. Потенциально стоит проверить.
Моя проблема была в том, что я с самого начала полностью завел игрока, но вместо обёртки div использовал фрейм iframe.
В моем случае сертификат SSL был недействительным для домена iframe, поэтому убедитесь, что URL-адрес iframe, на который вы пытаетесь отправить сообщения, открывает без каких-либо проблем (в случае, если вы загружаете свой iframe через https
).