Pregunta ¿Cómo se usa window.postMessage en todos los dominios?


Parece que el punto de window.postMessage es permitir una comunicación segura entre ventanas / marcos alojados en diferentes dominios, pero en realidad no parece permitir eso en Chrome.

Aquí está el escenario:

  1. Incrustar un <iframe> (con un src en el dominio B*) en una página en el dominio A
  2. El <iframe> termina siendo principalmente una etiqueta <script>, al final de la cual se ejecuta ...
  3. Llamo a window.postMessage ( algunos datos, page_on_A )

El <iframe> está definitivamente en el contexto del dominio B, y he confirmado que el javascript incrustado en ese <iframe> se ejecuta correctamente y las llamadas postMessage con los valores correctos.

Recibo este mensaje de error en Chrome:

No se pudo publicar el mensaje en UN.   El destinatario tiene origen segundo.

Aquí está el código que registra un detector de eventos de mensaje en la página de A:

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

También intenté llamar window.postMessage(some_data, '*'), pero todo lo que hace es suprimir el error.

¿Me estoy perdiendo el punto aquí, es window.postMessage (...) no destinado para esto? ¿O lo estoy haciendo horriblemente mal?

* Mime-type text / html, que debe permanecer.


75
2017-08-11 10:29


origen


Respuestas:


Aquí hay un ejemplo que funciona en Chrome 5.0.375.125.

La página B (contenido de iframe):

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

Tenga en cuenta el uso de top.postMessage o parent.postMessage no window.postMessage aquí

La página A:

<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 y B deben ser algo así como http://domain.com

EDITAR:

De otra pregunta, parece que los dominios (A y B aquí) deben tener un / Para el postMessage para trabajar apropiadamente


66
2017-08-11 11:49



Debería publicar un mensaje de fotograma a foto principal, una vez cargado.

secuencia de comandos de marco:

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

Y escúchalo en el padre:

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

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

Use este enlace para más información: http://en.wikipedia.org/wiki/Web_Messaging


16
2017-12-04 10:36



Probablemente intente enviar sus datos de midominio.com a www.midominio.com o en reversa, tenga en cuenta que omitió "www". http://midominio.com y http://www.midominio.com son dominios diferentes a javascript.


1
2018-06-17 09:20