HTML iframe で親ページと子ページ間の双方向メッセージングを実装する例

HTML iframe で親ページと子ページ間の双方向メッセージングを実装する例

ある日、リーダーはメイン ページに iframe を埋め込み、親ページと子ページ間で双方向にメッセージを送信するという要件を提案しました。そこで私は解決策を提案しました: postMessage

知識理論の準備:

postMessage メソッドを使用すると、異なるソースからのスクリプトが制限された方法で非同期に通信できるようになり、クロステキスト ドキュメント、マルチウィンドウ、およびクロスドメイン メッセージ配信を実現できます。

文法:

otherWindow.postMessage(メッセージ、targetOrigin、[転送]);
  • otherWindow: iframe の contentWindow、window.open の実行によって返されるウィンドウ オブジェクト、または名前付きまたは数値でインデックス付けされた window.frames などの別のウィンドウへの参照。
  • メッセージ: 他のウィンドウに送信されるデータ。
  • targetOrigin: メッセージ イベントを受信できるウィンドウを指定します。その値は、制限がないことを示す文字列 "*" または URI にすることができます。
  • transfer: は、メッセージとともに渡される Transferable オブジェクトの文字列です。これらのオブジェクトの所有権はメッセージの受信者に譲渡され、送信者は所有権を保持しなくなります。

postMessage メソッドが呼び出されると、すべてのページ スクリプトが実行された後、MessageEvent メッセージがターゲット ウィンドウに送信されます。MessageEvent メッセージには、注意する必要がある 4 つのプロパティがあります。

  • タイプ: メッセージのタイプを示します
  • データ: postMessageの最初のパラメータ
  • origin: postMessageメソッドを呼び出すウィンドウのソースを示します
  • ソース: postMessageメソッドを呼び出すウィンドウオブジェクトを記録します

操作手順は以下のとおりです。

1. 2ページを用意する

  • http://a.com/main.html メインページ
  • http://b.com/iframepage.html ネストされたページ

メイン.html

<!DOCTYPE html> 
<html>
<ヘッド>
<メタ文字セット="utf-8">
<title>iframe+postMessage クロスドメイン通信メインページ</title>
</head>
<本文>
    <h1>メインページ</h1>
    <iframe id="child" src="http://b.com/iframepage.html"></iframe>
    <div>
        <h2>メインページのメッセージ受信エリア</h2>
        <span id="メッセージ"></span>
    </div>
</本文> 
</html>

iframeページ.html

<!DOCTYPE html>
<html>
<ヘッド>
<メタ文字セット="utf-8">
<title>iframe+postMessage クロスドメイン通信サブページ</title>
</head>
<本文>
    <h2>サブページ</h2>
    <div>
        <h3>メッセージエリアを受信</h3>
        <span id="メッセージ"></span>
    </div>
</本文>
</html>

2. 親が子供にメッセージを送る

メイン.html

<スクリプト>
    window.onload = 関数(){
        document.getElementById('child')
         .contentWindow.postMessage("メインページメッセージ", 
                「http://b.com/iframepage.html」)
    }
</スクリプト>

知らせ:

メッセージはページが読み込まれた後に送信する必要があります。そうでない場合、iframe が読み込まれていないためエラーが報告されます。

'DOMWindow' で 'postMessage' を実行できませんでした

サブページがメッセージを受信:

iframeページ.html

<スクリプト>
    window.addEventListener('メッセージ',function(イベント){
        console.log(イベント);
        document.getElementById('message').innerHTML = "受信" 
            + event.origin + "メッセージ: " + event.data;
    }、 間違い);
</スクリプト>

この時点で、ページが iframe のサブページに印刷されていることがわかります。

http://a.com からメッセージを受信しました: メイン ページ メッセージ`

コンソールに MessageEvent オブジェクトが出力されます。

3. 子どもが親にメッセージを送る

子ページはメッセージを受信後、親ページに返信します。

iframeページ.html

<スクリプト>
    window.addEventListener('メッセージ',function(イベント){
        console.log(イベント);
        document.getElementById('message').innerHTML = "受信" 
            + event.origin + "メッセージ: " + event.data;
        top.postMessage("サブページメッセージを受信しました", 'http://a.com/main.html')
    }、 間違い);
</スクリプト>

親ページはメッセージを受信し、次のように表示します。

window.addEventListener('メッセージ', 関数(イベント){
    document.getElementById('message').innerHTML = "受信" 
        + event.origin + "メッセージ: " + event.data;
}、 間違い); 

4. 完全なコード

メイン.html

<!DOCTYPE html>
<html>
<ヘッド>
<メタ文字セット="utf-8">
<title>iframe+postMessage クロスドメイン通信メインページ</title>
</head>
<本文>
    <h1>メインページ</h1>
    <iframe id="child" src="http://b.com/iframepage.html"></iframe>
    <div>
        <h2>メインページのメッセージ受信エリア</h2>
        <span id="メッセージ"></span>
    </div>
</本文> 
<スクリプト>
    window.onload = 関数(){
        document.getElementById('child')
         .contentWindow.postMessage("メインページメッセージ", 
            「http://b.com/iframepage.html」)
    }
    window.addEventListener('メッセージ', 関数(イベント){
        document.getElementById('message').innerHTML = "受信"
         + event.origin + "メッセージ: " + event.data;
    }、 間違い);
</スクリプト>
</html>

iframeページ.html

<!DOCTYPE html>
<html>
<ヘッド>
<メタ文字セット="utf-8">
<title>iframe+postMessage クロスドメイン通信サブページ</title>
</head>
<本文>
    <h2>サブページ</h2>
    <div>
        <h3>メッセージエリアを受信</h3>
        <span id="メッセージ"></span>
    </div>
</本文>
<スクリプト>
    window.addEventListener('メッセージ',function(イベント){
        if(window.parent !== event.source){return}
        console.log(イベント);
        document.getElementById('message').innerHTML = "受信" 
            + event.origin + "メッセージ: " + event.data;
        top.postMessage("サブページメッセージを受信しました", 'http://a.com/main.html')
    }、 間違い);
</スクリプト>
</html>

html親子ページiframe双方向メッセージングの実装例に関するこの記事はこれで終わりです。より関連性の高いhtml親子ページiframe双方向メッセージングコンテンツについては、123WORDPRESS.COMの以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも123WORDPRESS.COMをよろしくお願いいたします。

<<:  Web ページでの Unicode 文字の使用の概要 (&#、\u など)

>>:  CSSはカラフルでスマートな影の効果を実現します

推薦する

CSS3 のディスプレイのグリッドレイアウトとフレックスレイアウトの詳細な説明

Gird レイアウトは Flex レイアウトといくつかの類似点があり、どちらもコンテナーの内部項目を...

フレームセットを使用してワイドスクリーンを中央に配置するためのヒントを共有する

コードをコピーコードは次のとおりです。 <フレームセット cols="*,1280,...

Linux環境にJDK1.8をインストールする

目次1. インストール環境2. インストール手順ステップ1: インストールパッケージをダウンロードす...

CSS3 3Dクールキューブ変形アニメーションの実装

私はコーディングが大好きです。コーディングすると幸せになります!みなさんこんにちは、Counterで...

Linuxにおけるumaskコマンドの使用原理と計算方法の詳しい解説

目次umask umaskの使用法原理1. umask値2. ファイルディレクトリの最大権限3. 従...

Vue.$set の失敗の落とし穴の発見と解決

偶然、プロジェクト内でVue.$setが無効であることがわかりましたデータ フィルタリングを追加する...

Centos7.9 で独立したメール サーバーを構築するための詳細な手順

目次序文1. イントラネットDNS AレコードとMXレコードを構成する2. メールサーバの初期化設定...

Windows 環境での MySQL の解凍、インストール、バックアップ、復元

システム環境はserver2012です1. MySQLの解凍バージョンをダウンロードし、インストール...

vite+vue3+element-plus プロジェクトをビルドする手順

viteを使用してvue3プロジェクトを構築するターミナルで次のコマンドを実行すると、Vite を使...

Vueはシンプルな計算機能を実装します

この記事では、参考までに、簡単な計算機機能を実現するためのVueの具体的なコードを紹介します。具体的...

NGINXがウェブサイトのPV、UV、独立IPをカウントする方法の詳細な説明

Nginx: PV、UV、独立IPウェブサイトを作成する人なら誰でも、ウェブサイトのPV、UV、その...

HTML/CSS での空白処理とページ内の空白を保持する方法

HTML の空白ルールHTML では、コンテンツ内の複数のスペースは通常 1 つとみなされ、連続する...

Vueページジャンプの実装方法

1. this.$router.push() 1. ビュー <テンプレート> <d...

MySQLのINサブクエリによってインデックスが使用できなくなる問題を解決する

今日は、MySQL IN サブクエリの最適化に関するケーススタディを見ました。最初は少し懐疑的でした...