82 votes

Comment utilisez-vous window.postMessage sur plusieurs domaines?

Il semble que le point de la fenêtre.postMessage est de permettre une communication sûre entre windows/images hébergées sur des domaines différents, mais il ne fait pas semblent permettre que dans google Chrome.

Voici le scénario:

  1. Intégrer un <iframe> (avec un src sur le domaine B*) dans une page sur le domaine d'Un
  2. Les <iframe> finit par être essentiellement une balise <script>, à la fin de son exécution...
  3. J'fenêtre d'appel.postMessage( some_data, page_on_A )

Les <iframe> est très certainement dans le contexte du domaine B, et j'ai confirmé que le javascript intégré dans ce <iframe> s'exécute correctement et appels postMessage avec les valeurs correctes.

Je reçois ce message d'erreur dans google Chrome:

Parvenez pas à envoyer de message à Un. Le bénéficiaire a l'origine B.

Voici le code qui enregistre un message d'écouteur d'événement dans la page:

window.addEventListener(
  "message",
  function (event) {
    // Do something
  },
  false);

J'ai aussi essayé de les appeler, window.postMessage(some_data, '*'), mais tout ce qui n'est supprimer l'erreur.

Je suis juste à côté de l'essentiel, ici, est de fenêtre.postMessage(...) n'était pas fait pour cela? Ou suis-je viens de le faire horriblement mal?

*Type Mime text/html, il doit rester.

76voto

Mic Points 13418

Voici un exemple qui fonctionne sur Chrome 5.0.375.125.

La page B (iframe contenu):

<html>
    <head></head>
    <body>
        <script>
            top.postMessage('hello', 'A');
        </script>
    </body>
</html>

Notez l'utilisation de l' top.postMessage ou parent.postMessage pas window.postMessage ici

De la page:

<html>
<head></head>
<body>
    <iframe src="B"></iframe>
    <script>
        window.addEventListener( "message",
          function (e) {
                if(e.origin !== 'B'){ return; } 
                alert(e.data);
          },
          false);
    </script>
</body>
</html>

A et B doit être quelque chose comme http://domain.com

EDIT:

À partir d' une autre question, il semble les domaines(A et B) doit avoir un / de la postMessage pour fonctionner correctement.

21voto

Golyo Points 29

Vous devriez poster un message de frame en parent après avoir été chargé.

script de cadre:

 $(document).ready(function() {
    window.parent.postMessage("I'm loaded", "*");
});
 

Et écoute-le en parent:

 function listenMessage(msg) {
    alert(msg);
}

if (window.addEventListener) {
    window.addEventListener("message", listenMessage, false);
} else {
    window.attachEvent("onmessage", listenMessage);
}
 

Utilisez ce lien pour plus d'informations: http://en.wikipedia.org/wiki/Web_Messaging

2voto

Getoriks Points 1

Vous essayez probablement d’envoyer vos données de mydomain.com à www.mondomaine.com ou inversement, NOTEZ que vous avez oublié "www". http://mydomain.com et http://www.mydomain.com sont des domaines différents de javascript.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X