Parece que el objetivo de window.postMessage es permitir la comunicación segura entre ventanas / marcos alojados en diferentes dominios, pero en realidad no parece permitir eso en Chrome.
Este es el escenario:
- Incrustar un <iframe> (con a
src
en el dominio B * ) en una página en el dominio A - El <iframe> termina siendo principalmente una etiqueta <script>, al final de la cual se ejecuta ...
- Llamo window.postMessage ( some_data , 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 llama postMessage
con los valores correctos.
Recibo este mensaje de error en Chrome:
No se puede enviar mensaje a una . Destinatario tiene origen B .
Aquí está el código que registra un detector de eventos de mensajes 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í, window.postMessage (...) no está destinado a esto? ¿O simplemente lo estoy haciendo horriblemente mal?
* Texto / html tipo mimo, que debe permanecer.
fuente
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
oparent.postMessage
nowindow.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:
Desde otra pregunta , parece que los dominios (A y B aquí) deben tener un
/
parapostMessage
que funcione correctamente.fuente
postMessage
Debe publicar un mensaje desde el marco al padre, después de cargarlo.
script de marco:
$(document).ready(function() { window.parent.postMessage("I'm loaded", "*"); });
Y escúchalo 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
fuente
Probablemente intente enviar sus datos de midominio.com a www.mydomain.com o al revés, NOTA que se perdió "www". http://mydomain.com y http://www.mydomain.com son dominios diferentes a javascript.
fuente
file:///
¿Es posible obtener errores de dominio al extraer contenido únicamente del sistema de archivos local?