Cómo se usa window.postMessage a través de dominios?


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

Este es el escenario:

  1. Incrustar un
  2. El
  3. Llamo a window.postMessage( some_data, page_on_A )

El

Recibo este mensaje de error en Chrome:

No se puede enviar un mensaje a A. El receptor tiene origen B .

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

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

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

Estoy perdiendo el punto aquí, es ventana.postMessage(...¿no es para esto? ¿O lo estoy haciendo terriblemente mal?

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

Author: Kevin Montrose, 2010-08-11

3 answers

Aquí hay un ejemplo que funciona en Chrome 5.0.375.125.

La página B (contenido del 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, se ve que los dominios(A y B aquí) deben tener un / para que el postMessage funcione correctamente.

 66
Author: Mic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:31:37

Debe publicar un mensaje de frame al padre, después de cargado.

Guión de marco:

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

Y escucharlo en padre:

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

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

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

 17
Author: Golyo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-04 10:36:57

Probablemente intente enviar sus datos desde mydomain.com to www.mydomain.com o al revés, NOTA que te perdiste "www". http://mydomain.com y http://www.mydomain.com son dominios diferentes a javascript.

 1
Author: Getoriks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-17 09:20:47