2010-07-26 13 views
7

La documentación para postMessage implica que es posible enviar mensajes entre dominios. Sin embargo:¿Cómo puedo hacer postMessage entre dominios?

// When the popup has fully loaded, if not blocked by a popup blocker 

Eso no es una nota muy clara de cómo a hacerlo realmente.

Imaginemos dos sitios web:

  1. [padre] alojado en qc-a.nfshost.com
  2. [infantil] alojado en qc-b.quadhome.com

En el padre:

document.addEventListener('message', function(e) { 
    alert('Parent got (from ' + e.origin + '): ' + e.data); 

    e.source.postMessage('Round-tripped!', 'http://qc-b.quadhome.com'); 
}, false); 

function go() { 
    var w = window.open('http://qc-b.quadhome.com', 'test'); 

    /* This doesn't work because same-origin policy prevents knowing when 
    the opened window is ready. */ 

    w.postMessage('Vain attempt.', 'http://qc-b.quadhome.com'); 
} 

Y, en el niño:

document.addEventListener('message', function(e) { 
    alert('Child got (from ' + e.origin + '): ' + e.data); 
}, false); 

window.opener.postMessage('Ready!', 'http://qc-a.nfshost.com'); 

Todo en vano

¿Ayuda?

Respuesta

8

Actualmente, veo dos problemas. Leve error en el código y el problema de tiempo de espera.

1) El error que estoy viendo en el código es que usted está utilizando document.addEventListener. Creo que el correcto es window.addEventListener. Está en el ejemplo en la página postMessage.

2) Con el tiempo de espera, puede hacer que la ventana secundaria postMessage a los padres. La ventana principal sabrá cuando el niño esté listo.

+4

En resumen, soy un idiota. Se reemplazó 'document' con' window' y la devolución de llamada lista trabajó a través de 'window.opener.postMessage'. ¡Gracias! –

+0

sucede a lo mejor de nosotros :) –

0

Está abriendo la ventana & publicando el mensaje después de la otra. No hay forma de que el documento abierto esté listo para aceptar el mensaje de la publicación. Intente demorar la llamada a postMessage hasta que la ventana haya terminado de cargarse.

Una forma muy simple de probar esto es envolver w.postMessage() en un setTimeout (durante 10 segundos) y ver si puede publicarlo cuando el documento esté listo.

+1

Derecha. El comentario en el código menciona que no hay forma (que yo sepa) de saber cuándo está lista la ventana. Y un tiempo de espera de 10 segundos parece un poco ... hacky. Aviso en la ventana secundaria, trato de hacer un postMessage indicando la preparación de regreso al abridor. Eso también falla. ¿Pensamientos? –

Cuestiones relacionadas