2016-08-04 4 views
1

私はこのコードを持っていますが、MessageEventの起点を*に設定しましたが、コンソールのプロンプトが表示されます起点 "AAAA"のフレームが原点 "BBBB"のフレームにアクセスするのをブロックしました。プロトコル、ドメイン、およびポートは一致する必要があります。誰でも知っている理由は?発信元ポリシーに関して、postMessage()とdispatchEvent()の違いは何ですか?

ただし、window.parent.postMessage(size, "*")を使用すると動作します。

+0

@Kaiido見つけることができます。このコードは、iframe 'src'が参照している外部リソースに配置しました。 – Blake

+0

@Kaiido彼らは別のドメインに属しているので、私は 'origin:' * 'を最初に設定しています – Blake

答えて

2

エラーメッセージは、異なる起源である場合、クロスオリジンのiframeは、一般的に親からメソッドを呼び出すことができないことを示しています。 dispatchEventメソッドが含まれています(そうでない場合、iframeは親ページにマウスイベントを生成するなど)。

postMessage APIは、明確に定義されたように、クロスオリジン通信を可能にするために正確に設計され、その例外です。

(「*」にoriginを設定すると、ここであなたを助けにはなりません。一般的には、そのプロパティは、メッセージがpostMessageを経由して送信されたときに、ブラウザによって設定されることが予想され、ときに手動でMessageEventオブジェクトを作成することは、ほとんど唯一のに便利です

1

2つのドキュメントの起点が同じでない場合、同じ出所のポリシーの制限によってアクセスが非常に制限されます。あなたの例では

dispatchEvent()は異なるフレーム(window.parent)へのアクセスが制限されています。

window.postMessage()は、同一生成元ポリシーの制限を回避クロスウィンドウメッセージングを行うことを可能にします。

targetOriginwindow.postMessage())は、リテラル文字列 "*"(優先度なし)またはURIとして、イベントを送出するためにotherWindowの起源を指定します。

本番コードにあなたのコードをより安全にするために、特定のURIを使用する必要があることに注意してください。私は、受信側のカスタム名をしたいのでしっかりwindow.postMessage()を使用する方法の詳細については、こちらをhttps://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage

関連する問題