2010-07-26 9 views
7

La documentazione per postMessage implica che la messaggistica tra domini è possibile. Tuttavia:Come posso eseguire postMessage su più domini?

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

Che non è molto chiara nota del come a farlo davvero.

Immaginate due siti web:

  1. [Parent] ospitato su qc-a.nfshost.com
  2. [Bambino] ospitato su qc-b.quadhome.com

nel genitore:

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'); 
} 

E, nel child:

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

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

Tutto inutilmente.

Aiuto?

risposta

8

Attualmente, vedo due problemi. Leggero errore nel codice e il problema di timeout.

1) L'errore che sto vedendo nel tuo codice è che stai usando document.addEventListener. Penso che quello giusto sia window.addEventListener. È nell'esempio sulla pagina postMessage.

2) Con il timeout, è possibile impostare la finestra secondaria postMessage sul genitore. La finestra genitore saprà quindi quando il bambino è pronto.

+4

In breve, sono un idiota. Sostituito 'document' con' window' e il callback pronto ha funzionato tramite 'window.opener.postMessage'. Grazie! –

+0

Succede al meglio di noi :) –

0

Stai aprendo la finestra & postando il messaggio uno dopo l'altro. Non è possibile che il documento aperto sia pronto per accettare il messaggio postale. Prova a ritardare la chiamata postMessage fino al termine del caricamento della finestra.

Un modo molto semplice per testare questo è avvolgere w.postMessage() in un setTimeout (per 10 secondi) e vedere se può postarlo quando il documento è pronto.

+1

Giusto. Il commento nel codice indica che non c'è modo (che io sappia) di sapere quando la finestra è pronta. E un timeout di 10 secondi sembra un po '... hacky. Avviso nella finestra secondaria, provo a fare un messaggio post che indica la disponibilità di nuovo fino all'apertura. Anche questo fallisce. Pensieri? –