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:
- carga el iframe (esto es asíncrona, también)
- Puesta en funcionamiento de escucha de mensajes
- mensaje Publica en el marco flotante (tratando aquí)
- Espere a que lleguen más mensajes
En el ifram e:
- Configurar receptor de mensajes
- Publicar un mensaje a la ventana padre (tratando aquí)
- 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.