HTML5 postMessage使用マニュアル
コーディングをしていると、次のようなクロスドメインのシナリオに遭遇することがよくあります。
1、ページ内にiframeをネストさせ、iframeのメッセージングを行う。
2、ページ間、複数ページ間のメッセージの受け渡し
これらの頭痛の種であるクロスドメインの問題に対して、html5は特別に新しい機能であるpostMessage(クロスドキュメントメッセージング)を導入しました。postMessageを使用するには、データとoriginUrlという二つのパラメータを渡す必要があります。データは渡されるコンテンツですが、一部のブラウザでは文字列パラメータのみを扱うことができるので、一般的にはデータを少しシリアライズ、すなわちJSON.stringify()、およびoriginUrlはターゲットurl(指定したウィンドウ)に配置します。
ここでは、わかりやすく書きやすいと思う、ダンプする例を紹介します。
1. ページ内のネストしたiframe
親ページです。
htmlを使用します。
<div id='parent'>hello word postMessage</div>
<iframe src="http://127.0.0.1:8082/index2.html" id='child'></iframe>
jsです。
window.onload=function(){
window.frames[0].postMessage('postMessage','http://127.0.0.1:8082/index2.html')
}
window.addEventListener('message',function(e){
console.log(e)
document.getElementById('parent').style.color=e.data
})
サブページです。
htmlを使用します。
<div id='button' onclick='changeColor();' style="color:yellow">Accept message</div>
jsです。
window.addEventListener('message',function(e){
console.log(e)
let color = document.getElementById('button').style.color
window.parent.postMessage(color,'http://127.0.0.1:8081/index.html')
});
function changeColor(){
let buttonColor = document.getElementById('button').style.color
buttonColor='#f00'
window.parent.postMessage(buttonColor,'http://127.0.0.1:8081/index.html')
}
親ページは postMessage メソッドで iframe にメッセージを渡し、子ページは window.addEventListener で message メソッドをリッスンして親ページから渡された値を取得します。下図に示すように、dataは親ページから渡された値です。
子ページは親ページにメッセージを渡しますが、これも postMessage メソッドを介して行います。ただし window.parent.postMessage(data,url) と同じ方法ではありません。親ページは、同様にメッセージイベントをリッスンすることで値を取得します。
2. 複数ページ間でのメッセージの受け渡し
親ページです。
htmlを使用します。
<div id='parent' onclick="postMessage()">hello word postMessage</div>
jsです。
let parent = document.getElementById('parent')
function postMessage(){
let windowOpen=window.open('http://127.0.0.1:8082/index2.html','postMessage')
setTimeout(function(){
windowOpen.postMessage('postMessageData','http://127.0.0.1:8082/index2.html')
},1000)
}
サブページです。
htmlを使用します。
<div id='button' onclick='changeColor();' style="color:#f00">Accept message</div>
jsです。
window.addEventListener('message',function(e){
console.log(e)
});
親ページは、window.open で別のページを開いて値を渡すことで、子ページにメッセージを渡します。postMessage を使う場合は、setTimeout を使ってメッセージの受け渡しを遅らせる必要があることに注意してください。なぜなら、子ページは一度に読み込まれないので、子ページのリスニングイベントはまだ始まっておらず、この時点では値を受け取ることはできないからです。
以上が今回の記事の内容ですが、皆様の学習の一助となり、スクリプトハウスをより一層応援していただければ幸いです。
関連
-
HTML5ページオーディオの自動再生実装
-
ポップアップウィンドウのhtml実装例
-
HTML5の再適応スキームとビューポート適応の問題点を解説
-
中国語の文字にピンインを追加してコンポーネントを折りたたみ、展開するためのHTML5コード
-
html2canvasを使ってcanvasにhtmlの内容を書き込んで画像を生成する方法
-
textareaで改行や空白を処理する
-
ホームページのダイナミックな動画背景を実現するHTML5サンプルコード
-
iPhoneXのためのHtml5ページ適応(簡単なことです)
-
HTML5ページの長押しで画像を保存する機能を解決するための記事
-
透明度を変更するためのキャンバスピクセル処理コード
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
html5でポップアップ画像のクリック機能を実装する
-
html+css イメージスキャナ効果用
-
Html5モバイルdivは、ナビゲーションバーの下部を達成するために下部に固定されているいくつかの方法
-
AmazeUIがモーダルボックスにフォームを埋め込んでモーダルインプットボックスを形成する
-
メソッドステップを構築するフレームワーク「AmazeUI」(グラフィック)
-
ビデオカバーを設定するH5ビデオポスタープロパティ
-
9ボックスグリッドの原則を用いたHTMLページレイアウト
-
複数の画像を編集するためのキャンバス画像エディタの実装方法
-
キャンバスラバーバンド線引き塗布方法
-
モバイルhtml5で長押しイベントをシミュレートする方法