it-swarm.com.ru

Не удалось выполнить 'postMessage' для 'DOMWindow': предоставленный целевой источник не соответствует источнику окна получателя ('null')

У меня есть игра в heroku, сейчас я пытаюсь заставить ее работать на холсте Facebook, но, хотя она работает в Firefox, в Chrome и IE нет.

IE показывает предупреждение с кнопкой, при нажатии на кнопку он показывает содержимое.

В хроме я получаю эту ошибку:

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

В чем дело?

15
Sascuash

Убедитесь, что целевое окно, в котором вы/FB публикуете сообщение, загружено. Большую часть времени я получал эту ошибку, когда не загружался скрытый фрейм, на который я отправлял сообщения.

30
Gustaff

Другая причина, по которой это может происходить, заключается в том, что вы используете iframe с атрибутом sandbox, а 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>

Я не нашел решения, кроме:

  • добавить allow-same-Origin в песочницу (не хотел этого делать)
  • использовать f.postMessage("hello world!", '*');
14
Jamie McCrindle

Чтобы проверить, был ли загружен кадр, используйте функцию загрузки. Или поместите вашу основную функцию в load: я рекомендую использовать load при создании 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');
2
twiii_florence

В моем случае я не добавил префикс http://. Потенциально стоит проверить. 

1
nikk wong

Моя проблема была в том, что я полностью запустил плеер, но я использовал iframe вместо div-оболочки.

0
Walter Kimaro

В моем случае сертификат SSL был недействительным для домена iframe, поэтому убедитесь, что URL-адрес iframe, на который вы пытаетесь отправить сообщения, открывает без каких-либо проблем (в случае, если вы загружаете свой iframe через https).

0
Artyom Pranovich