window.postMessage() メソッド

導入

window.postMessage() は、主に iframe 埋め込みウィンドウや新しく開かれたウィンドウなど、異なるブラウザ ウィンドウ間の通信に使用されます。 2 つのウィンドウの原点が同じである必要がないため、幅広い用途に使用できます。

window.postMessage()window オブジェクトは、メッセージを送信するためのターゲット ウィンドウです。たとえば、親ウィンドウが window.open() を通じて子ウィンドウを開く場合、子ウィンドウは targetWindow = window.opener を通じて親ウィンドウを取得できます。別の例として、親ウィンドウが「iframe」を通じて子ウィンドウを埋め込む場合、子ウィンドウは「window.parent」を通じて親ウィンドウを取得できます。

パラメータと戻り値

window.postMessage() メソッドにはいくつかの使用形式があります。

最も簡単な方法はダイレクトメッセージを送信することです。

window.postMessage(メッセージ)

上記の書き込みメソッドの「メッセージ」は送信されるメッセージであり、文字列またはオブジェクトにすることができます。それがオブジェクトの場合、ブラウザは自動的にオブジェクトをシリアル化し、文字列として送信します。

window.postMessage() は任意の 2 つのソース (プロトコル + ドメイン名 + ポート) 間の通信に使用できるため、セキュリティ リスクを軽減するために、2 番目のパラメーター targetOrigin を使用してターゲット ウィンドウのソースを指定できます。 。

window.postMessage(メッセージ, targetOrigin)

上記の記述方法における「targetOrigin」は、「https://example.com」など、ターゲットウィンドウ内のWebページの起点を表す文字列です。対象ウィンドウに制限がない場合は、このパラメータを省略するか、`*` として記述することができます。このパラメータを指定すると、ターゲット ウィンドウが指定されたソース (プロトコル + ドメイン名 + ポート) に準拠している場合にのみ、ターゲット ウィンドウはメッセージ送信イベントを受信します。

window.postMessage() は、ArrayBuffer オブジェクトなどの転送可能なオブジェクトを送信するための 3 番目のパラメータを指定することもできます。

window.postMessage(メッセージ、ターゲットオリジン、転送)

上記の文中の「譲渡」とは譲渡可能な対象のことです。オブジェクトが送信されると、所有権はターゲット ウィンドウに転送され、現在のウィンドウはそのオブジェクトを使用できなくなります。大量のデータを送信する際の効率を向上させるための設計です。

2 つのパラメータ targetOrigintransfer を 2 番目のパラメータとしてオブジェクトに記述することもできます。

window.postMessage(メッセージ, { targetOrigin, transfer })

以下は、ポップアップ ウィンドウにメッセージを送信する例です。

const Popup = window.open('http://example.com');
Popup.postMessage("こんにちは!", "http://example.com");

window.postMessage() メソッドには戻り値がありません。

メッセージイベント

メッセージ イベントは、現在のウィンドウが別のウィンドウから送信されたメッセージを受信したときに発生します。このイベントを聞くことで、相手から送られてきたメッセージを受信することができます。

window.addEventListener(
  "メッセージ"、
  (イベント) => {
    if (event.origin !== "http://example.com") return;
    // ...
  }、
  間違い、
);

イベントリスニング関数はイベントパラメータオブジェクトを受け取ることができます。このオブジェクトには次のプロパティがあります。

  • data: 他のウィンドウから送信されたメッセージ。
  • 送信元: メッセージを送信したウィンドウのソース (プロトコル + ドメイン名 + ポート)。
  • source: メッセージを送信したウィンドウ オブジェクトへの参照。この属性を使用して双方向通信を確立します。以下に例を示します。
window.addEventListener("メッセージ", (イベント) => {
  if (event.origin !== "http://example.com:8080") return;
  イベント.ソース.postMessage(
    "やあ!"、
    イベント.オリジン、
  );
});

親ページは origin1.com で、子ページ origin2.com が開き、そこにメッセージが送信されます。

関数 sendMessage() {
  const otherWindow = window.open('https://origin2.com/origin2.html');
  const message = 'Origin 1 からこんにちは!';
  const targetOrigin = 'https://origin2.com';
  otherWindow.postMessage(メッセージ, targetOrigin);
}

子ページ「origin2.com」は、親ページから送信されたメッセージをリッスンします。

window.addEventListener('メッセージ'、receiveMessage、false);

関数受信メッセージ(イベント) {
  if (event.origin === 'https://origin1.com') {
    console.log('受信したメッセージ: ' +event.data);
  }
}

以下は、親ウィンドウ「origin1.com」にメッセージを送信する iframe 埋め込みウィンドウの例です。

関数 sendMessage() {
  const message = '子ウィンドウからこんにちは!';
  window.parent.postMessage(メッセージ, 'https://origin1.com');
}

作者: wangdoc

アドレス: https://wangdoc.com/

ライセンス: クリエイティブ・コモンズ 3.0