2010-07-26 18 views
7

La documentation pour postMessage implique que la messagerie inter-domaines est possible. Cependant:Comment puis-je effectuer un post-message inter-domaine?

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

Ce n'est pas une note très claire de la façon dont de le faire réellement.

Imaginez deux sites:

  1. [Parent] hébergé sur qc-a.nfshost.com
  2. [enfant] hébergé sur qc-b.quadhome.com

Dans le parent:

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

Et, dans le enfant:

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

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

En vain.

Aide?

Répondre

8

Actuellement, je vois deux problèmes. Légère erreur dans le code et le problème de timeout.

1) L'erreur que je vois dans votre code est que vous utilisez document.addEventListener. Je pense que la bonne est window.addEventListener. C'est dans l'exemple sur la page postMessage.

2) Avec le timeout, vous pouvez avoir la fenêtre enfant postMessage au parent. La fenêtre parent va alors savoir quand l'enfant est prêt.

+4

En bref, je suis un idiot. Remplacé 'document' par' window' et le callback prêt a fonctionné via 'window.opener.postMessage'. Je vous remercie! –

+0

Ca se passe pour le meilleur d'entre nous :) –

0

Vous ouvrez la fenêtre & affichant le message l'un après l'autre. Il n'y a aucun moyen que le document ouvert sera prêt à accepter le message de poste. Essayez de retarder l'appel postMessage jusqu'à la fin du chargement de la fenêtre.

Une manière très simple de tester ceci est d'envelopper w.postMessage() dans un setTimeout (pendant 10 secondes) et de voir s'il peut le poster quand le document est prêt.

+1

Droite. Le commentaire dans le code mentionne qu'il n'y a aucun moyen (que je sache) de savoir quand la fenêtre est prête. Et un délai de 10 secondes semble un peu ... hacky. Remarquez dans la fenêtre enfant, j'essaie de faire un postMessage indiquant la disponibilité de retour à l'ouvreur. Cela échoue aussi. Pensées? –