2012-01-30 20 views
5

Sto pensando di utilizzare window.postMessage direttamente per le comunicazioni tra domini.Posso eseguire la comunicazione tra domini sincroni con window.postMessage?

Se lo faccio:

  1. postMessage() dal telaio genitore
  2. Caricare un iframe
  3. window.addEventListener("message", callback, false); dal iframe bambino

Quando sarà il messaggio che ho postato prima di caricare l'iframe essere eseguito? Sono garantiti per essere eseguiti a tutti? Ci sono garanzie temporali?

Vorrei passare un parametro dal frame superiore che influenza l'inizializzazione del frame secondario.

risposta

6

La funzione postMessage() è asincrona, il che significa che verrà restituita immediatamente. Quindi non puoi fare comunicazione sincrona con esso.

Nel tuo esempio, il messaggio inviato svanirà nel vuoto, perché non c'è alcun listener per l'evento messaggio nel momento in cui viene eseguita la funzione postMessage().

Se si carica prima l'iframe e successivamente si chiama postMessage(), potrebbe esserci un problema di temporizzazione, forse. (Dalla mia esperienza non ce n'è, il codice genitore è sempre eseguito per primo, ma non sono sicuro su questo punto.)

Di seguito è la mia soluzione per il problema di non sapere esattamente quando l'iframe sarà pronto.

Nella finestra padre:

  1. carico l'iframe (questo è asincrona, troppo)
  2. Impostare messaggio ascoltatore
  3. messaggio Pubblica l'iframe (solo cercando qui)
  4. Aspetta che arrivino altri messaggi

Nell' ifram e:

  1. Impostare messaggio ascoltatore
  2. Invia messaggio alla finestra padre (solo cercando qui)
  3. Attendere più messaggi a venire

Chi riceve il primo messaggio dall'altra parte allora inizia la vera comunicazione.

Nella mia esperienza, il messaggio dal genitore all'iframe viene sempre perso, quindi la comunicazione inizia quando il genitore riceve il messaggio dall'iframe. Ma in questa configurazione non è importante quale inizia per primo.