ドメイン間でwindow.postMessageをどのように使用しますか?


89

window.postMessageのポイントは、異なるドメインでホストされているウィンドウ/フレーム間の安全な通信を可能にすることであるように見えますが、実際にはChromeではそれを許可していないようです。

シナリオは次のとおりです。

  1. ドメインAのページに<iframe>(srcドメインB *にある)を埋め込む
  2. <iframe>は、ほとんどが<script>タグになり、最後に実行されます...
  3. window.postMessage(some_datapage_on_A)を呼び出します

<iframe>は間違いなくドメインBのコンテキストにあり、その<iframe>に埋め込まれたJavaScriptが正しく実行さpostMessageれ、正しい値で呼び出されることを確認しました。

Chromeで次のエラーメッセージが表示されます。

Aにメッセージを投稿できません。受信者の原点はBです。

Aのページにメッセージイベントリスナーを登録するコードは次のとおりです。

window.addEventListener(
  "message",
  function (event) {
    // Do something
  },
  false);

私も呼び出してみましたwindow.postMessage(some_data, '*')が、エラーを抑えるだけです。

ここで要点を見逃しているだけですか、window.postMessage(...)はこれを目的としていませんか?それとも私はそれをひどく間違っているだけですか?

* MIMEタイプのtext / html。そのままにしておく必要があります。


1
あなたはおそらくこれをすでに知っているでしょうが、MDCはpostMessageに優れた要約を持っています:developer.mozilla.org/en/DOM/window.postMessage FF実装については明らかにですが、それが機能しない理由を説明する何かがあるかもしれません。
ペッカ2010

回答:


79

これはChrome5.0.375.125で動作する例です。

ページB(iframeコンテンツ):

<html>
    <head></head>
    <body>
        <script>
            top.postMessage('hello', 'A');
        </script>
    </body>
</html>

使用に注意してくださいtop.postMessageparent.postMessageではないwindow.postMessageここに

ページA:

<html>
<head></head>
<body>
    <iframe src="B"></iframe>
    <script>
        window.addEventListener( "message",
          function (e) {
                if(e.origin !== 'B'){ return; } 
                alert(e.data);
          },
          false);
    </script>
</body>
</html>

AとBは次のようなものでなければなりません http://domain.com

編集:

別の質問から、ドメイン(ここではAとB)が正しく機能する/ためにはpostMessageが必要であるように見えます。


3
ページAがメッセージの発信元を確認するとき、発信元には末尾の「/」は含まれません。ページBで末尾の「/」が指定されているかどうかは問題ではないようです。注意すべきもう1つの点は、URLは絶対URLでなければならないということです。
catch22 2012

1
この答えは私を少し混乱させ、まだ答えを探していました。 blog.teamtreehouse.com/cross-domain-messaging-with-postmessageには、postMessageの非常に優れた説明が含まれています。重要なのは、メッセージの送信者が受信者のドメインを知っていることです。上記の例では、AとBは同じドメインである必要はありませんが、BはAによって使用されているまさにドメインを知っている必要があります
グレッグBogumil

7
質問はクロスドメインについてです。受け入れられた答えは、ほぼ同じドメインです。
スタックラー2015年

@stackular、正確ではありません。AとBは任意のドメインにすることができます。それが持っている主な理由ですpostMessage
マイク2015年

1
+1。このソリューションが私たちのケースで機能したことを確認したいと思います。異なるドメインのiframeを含むページがあります。Chromeブラウザでは、この唯一の作品は、Firefoxののように私たちが使用する必要があることに注意してくださいwindow.parent.postMessageを代わりにトップ。これが他のブラウザに適用できるかどうかはわかりませんが。
rahmatns

24

ロード後、フレームから親にメッセージを投稿する必要があります。

フレームスクリプト:

$(document).ready(function() {
    window.parent.postMessage("I'm loaded", "*");
});

そしてそれを親で聞いてください:

function listenMessage(msg) {
    alert(msg);
}

if (window.addEventListener) {
    window.addEventListener("message", listenMessage, false);
} else {
    window.attachEvent("onmessage", listenMessage);
}

詳細については、次のリンクを使用してください:http//en.wikipedia.org/wiki/Web_Messaging


2

おそらく、mydomain.comからwww.mydomain.comに、またはその逆にデータを送信しようとします。「www」を見逃したことに注意してください。http://mydomain.comhttp://www.mydomain.comは、javascriptとは異なるドメインです。


2
私が行っているプロジェクトfile:/// では、ローカルファイルシステムからのみコンテンツをプルするときにドメインエラーが発生する可能性がありますか?
Jacksonkr 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.