8

postMessageのドキュメントは、クロスドメイン メッセージングが可能であることを暗示しています。でも:

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

それは実際にそれを行う方法の非常に明確なメモではありません。

次の 2 つの Web サイトを想像してください。

  1. [親] でホストqc-a.nfshost.com
  2. [子] でホストqc-b.quadhome.com

親で:

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

そして、子では:

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

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

すべて役に立たない。

ヘルプ?

4

2 に答える 2

8

現在、2 つの問題が発生しています。コードのわずかなエラーとタイムアウトの問題。

1) あなたのコードに表示されているエラーは、document.addEventListener を使用していることです。正しいのはwindow.addEventListenerだと思います。postMessageページの例にあります。

2) タイムアウトを使用すると、子ウィンドウを親ウィンドウに postMessage させることができます。親ウィンドウは、子ウィンドウの準備ができたことを認識します。

于 2010-07-26T07:32:44.003 に答える
0

ウィンドウを開き、メッセージを次々に投稿しています。開いているドキュメントが投稿メッセージを受け入れる準備ができている方法はありません。ウィンドウの読み込みが完了するまで、postMessage の呼び出しを遅らせてみてください。

これをテストする非常に簡単な方法は、w.postMessage() を setTimeout で (10 秒間) ラップし、ドキュメントの準備ができたときに投稿できるかどうかを確認することです。

于 2010-07-26T06:51:04.163 に答える