2012-01-30 17 views
5

Estoy pensando en usar window.postMessage directamente para la comunicación entre dominios.¿Puedo hacer síncrona entre dominios comunicación con window.postMessage?

Si hago:

  1. postMessage() del marco padre
  2. carga un iframe
  3. window.addEventListener("message", callback, false); del marco flotante niño

Cuándo los mensajes que he publicado antes de la carga sea el iframe ¿ejecutado? ¿Están garantizados para ser ejecutados en absoluto? ¿Hay garantías de tiempo?

me gustaría pasar un parámetro desde el marco superior que influye en la inicialización del marco secundario.

Respuesta

6

La función postMessage() es asíncrona, lo que significa que volverá inmediatamente. Entonces no puedes hacer comunicación sincrónica con él.

En el ejemplo, el mensaje enviado se desvanecerá en el vacío, porque no hay un detector para el evento de aviso en el momento en que se ejecuta la función postMessage().

Si desea cargar el marco flotante primera y llame postMessage() después, entonces podría haber un problema de tiempo, tal vez. (Desde mi experiencia no hay ninguno, el código padre siempre se ejecuta primero, pero no estoy seguro de este punto.)

A continuación se muestra mi solución para el problema de no saber exactamente cuándo estará listo el iframe.

En la ventana padre:

  1. carga el iframe (esto es asíncrona, también)
  2. Puesta en funcionamiento de escucha de mensajes
  3. mensaje Publica en el marco flotante (tratando aquí)
  4. Espere a que lleguen más mensajes

En el ifram e:

  1. Configurar receptor de mensajes
  2. Publicar un mensaje a la ventana padre (tratando aquí)
  3. Espere más mensajes que vienen

El que reciba el primer mensaje desde el otro lado luego comienza la comunicación real.

En mi experiencia, el mensaje de los padres a la iframe siempre se pierde, por lo que la comunicación comienza cuando el padre recibe el mensaje desde el iframe. Pero en esta configuración no es importante cuál comienza primero.

Cuestiones relacionadas