2010-07-26 9 views
7

Dokumentacja dla postMessage sugeruje, że przesyłanie wiadomości w wielu domenach jest możliwe. Jednakże:Jak mogę zrobić postMessage w wielu domenach?

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

To nie jest bardzo jasne, nuta jak faktycznie zrobić.

Wyobraźmy sobie dwie strony:

  1. [Nadrzędny] hostowane na qc-a.nfshost.com
  2. [dziecka] hostowane na qc-b.quadhome.com

W dominującej:

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

, aw dziecko:

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

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

Wszystko bez skutku.

Pomoc?

Odpowiedz

8

Obecnie widzę dwie kwestie. Niewielki błąd w kodzie i problem z przekroczeniem limitu czasu.

1) Wystąpił błąd w twoim kodzie, że używasz document.addEventListener. Myślę, że właściwym jest window.addEventListener. Jest w przykładzie na stronie postMessage.

2) Po przekroczeniu limitu czasu okno podrzędne może wyświetlać rodzicowi wiadomość. Okno macierzyste będzie wtedy wiedzieć, kiedy dziecko jest gotowe.

+4

Krótko mówiąc, jestem idiotą. Zastąpiony "dokument" przez 'window' i gotowe wywołanie zwrotne działało przez' window.opener.postMessage'. Dziękuję Ci! –

+0

Zdarza się nam jak najlepiej :) –

0

Otwierasz okno & umieszczając wiadomość po sobie. Nie ma możliwości, aby otwarty dokument był gotowy do zaakceptowania wiadomości post. Spróbuj opóźnić wywołanie postMessage, dopóki okno nie zakończy ładowania.

Bardzo prostym sposobem na przetestowanie tego jest owijanie w.postMessage() w setTimeout (przez 10 sekund) i sprawdzanie, czy można go opublikować, gdy dokument jest gotowy.

+1

Dobrze. Komentarz w kodzie wspomina, że ​​nie ma sposobu (o którym wiem), aby wiedzieć, kiedy okno jest gotowe. A 10-sekundowy limit czasu wydaje się nieco ... hacky. Zawiadomienie w oknie podrzędnym, staram się zrobić postMessage wskazując gotowość z powrotem do otwieracza. To też się nie udaje. Myśli? –