iframe+postMessageを使ったクロスドメインコミュニケーションのサンプルコード
通常、異なる2つのページのスクリプトの場合、それらを実行するページが同じプロトコル(通常はhttps)、ポート番号(httpsのデフォルト値は443)、ホストに位置している場合のみ、2つのスクリプトは互いに通信することが可能です。実際のプロジェクト開発では、親ページに別の子ページを埋め込んだり、親ページに別のページをポップアップさせるために iframe がよく使われますが、同一ソースポリシーの制限により、親子ページ間のスクリプトは通信を実現できず、親子ページ間のクロスドメインメッセージングは postMessage というメソッドを用いて実現されています。
構文
otherWindow.postMessage(message, targetOrigin, [transfer]);
otherWindow: iframeのcontentWindowプロパティや、window.openの実行により返されるウィンドウオブジェクトなど、他のページへの参照。
message:他のページに渡すデータ(データオブジェクトは構造化クローンアルゴリズムにより、それ自体をシリアライズする必要がなく、制限なく安全にターゲットウィンドウに渡すことができる)。
targetOrigin: ウィンドウの origin プロパティでメッセージイベントを受け取るウィンドウを、文字列 "*" (無制限の場合)または Url で指定します。メッセージ情報。メッセージの漏洩を防ぐため、通常は特定のurlを指定します。
transfer: オプションのパラメータです。
使用方法
1. 親ページです。(urlはhttp://www.b.com/main.html).
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>parent</title>
</head>
<body>
<iframe id="child" src="http://www.a.com/iframepage.html"></iframe>
<script>
window.onload = function(){
document.getElementById("child").contentWindow.postMessage("Message passed from main page","http://www.a.com/iframepage.html& quot;)
}
window.addEventListener('message', function(event){ //parent gets the message passed by the child
if(event.origin == "http://www.a.com"){
//you can do some logic here
}
}, false)
</script>
</body>
</html>
2. サブページ (url is http://www.a.com/iframepage.html)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>subpages</title>
</head>
<body>
<div> Here are the subpages</div>
<script>
window.addEventListener('message', function(event){
if(event.origin == "http://www.b.com"){
// you can do something here
top.postMessage("Child page received message from parent page", 'http://www.b.com/main.html')//Child page passes message to parent page
}
}, false);
</script>
</body>
</html>
postMessage メソッドを呼び出すと、すべてのページスクリプトが実行された後、ターゲットウィンドウに MessageEvent メッセージが送信されます。MessageEventメッセージには、注意すべき4つのプロパティがあります。
type: メッセージの種類を表します。
data: postMessageの最初のパラメータです。
origin: postMessage メソッドウィンドウのソースを示します。
source: postMessage メソッドを呼び出したウィンドウのオブジェクトを記録します。
特記事項
1. Aページに埋め込まれたBページの読み込みが完了するまで、必ずpostMessageによるクロスドメイン通信を行う。
2. 他のオリジンからの攻撃を防ぐために、必ずオリジンの判定を行い、ターゲットウィンドウから外れたオリジンを削除すること
今回は以上です。皆様の学習のお役に立てれば幸いです。また、Scripting Houseを応援していただければ幸いです。
関連
-
キャンバスが折り畳みパスを描くアニメーション
-
CAPTCHAを生成するHTML5サンプルコード
-
モバイルHTML5開発ツール vconsoleの詳細解説
-
AmazeUI モバイルページ トップナビゲーションバー ヘッダーとサイドナビゲーションバー offCanvas サンプルコード
-
html5 地図の現在位置の矢印の作り方の例
-
VSCodeカスタムhtml5テンプレート実装
-
window.openがブラウザにブロックされている場合の解決策を詳しく説明します。
-
HTML5ページの長押しで画像を保存する機能を解決するための記事
-
localStorageの有効期限を設定する詳細な方法
-
Canvas がクロスドメイン画像を導入し、toDataURL() エラーが発生する。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン