web-dev-qa-db-fra.com

Impossible d'exécuter 'postMessage' sur 'DOMWindow': l'origine cible fournie ne correspond pas à l'origine de la fenêtre du destinataire ('null')

J'ai un jeu dans heroku, maintenant j'essaye de le faire fonctionner dans la toile Facebook, mais, bien que cela fonctionne dans Firefox, dans Chrome et IE pas.

IE affiche un avertissement avec un bouton. Lorsque vous cliquez dessus, le contenu est affiché.

En chrome, j'obtiens cette erreur:

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

Qu'est-ce qui ne va pas?

15
Sascuash

Assurez-vous que le message cible que vous êtes en train de publier/le FB est chargé. La plupart du temps, j'ai eu cette erreur quand un iframe caché auquel j'ai envoyé des messages n'a pas pu être chargé.

30
Gustaff

Cela pourrait également se produire si vous utilisez une iframe dotée de l'attribut sandbox et que allow-same-Origin n'est pas défini, par exemple:

// 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>

Je n'ai pas trouvé de solution autre que:

  • ajouter allow-same-Origin au bac à sable (je ne voulais pas faire cela)
  • utiliser f.postMessage("hello world!", '*');
14
Jamie McCrindle

Pour vérifier si le cadre a été chargé, utilisez la fonction onload. Ou mettez votre fonction principale en charge: je vous recommande d'utiliser load lors de la création de l'iframe par 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

Dans mon cas, je n'ai pas ajouté le préfixe http://. Potentiellement intéressant à vérifier. 

1
nikk wong

Mon problème était que j'installais le joueur complètement depuis le début, mais j'ai utilisé un iframe au lieu d'un div.

0
Walter Kimaro

Dans mon cas, le certificat SSL n'était pas valide pour le domaine iframe, alors assurez-vous que l'iframe à laquelle vous essayez d'envoyer des messages ne pose aucun problème (au cas où vous chargez votre iframe sur https).

0
Artyom Pranovich