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はカラフルでスマートな影の効果を実現します

推薦する

iPhone デバイスの WAP ページでフォントサイズが大きい問題の解決策

JavaScriptコントロールを使用したくない場合は、次の方法を試してください。 Safariブラ...

MySQLの結合クエリ、ユニオンクエリ、サブクエリの原理と使用例の詳細な説明

この記事では、例を使用して、MySQL の結合クエリ、結合クエリ、サブクエリの原理と使用方法を説明し...

Portainer を使用して Docker のビジュアル インターフェースを構築する方法

ポーテナーの紹介Portainer は、ステータス表示パネル、アプリケーション テンプレートの迅速な...

MySQL学習記録: KEYパーティションが引き起こした血なまぐさい事件

需要背景ビジネス テーブル tb_image のデータの一部は次のとおりです。id は一意ですが、i...

HTML テーブル タグ チュートリアル (34): 行スパン属性 ROWSPAN

複雑なテーブル構造では、一部のセルが水平方向に複数のセルにまたがるため、行間属性 ROWSPAN を...

Vueのログインとログアウトの詳細な説明

目次ログインビジネスプロセスログイン機能の実装要約するまず、エフェクトの実装プロセスを見てみましょう...

dockerにros2をインストールするための詳細な手順

目次メイントピック1. UbuntuにDockerをインストールする2. DockerにROS2-F...

MySQL共通ストレージエンジンの機能と使用方法の詳細な説明

この記事では、一般的な MySQL ストレージ エンジンの機能と使用方法を例を使って説明します。ご参...

Virtualbox で Ubuntu 16.04 の起動時に共有ディレクトリを自動的にマウントする最良の方法

仮想マシンを使用する人は通常、操作と使用を容易にするために仮想マシン用の共有ディレクトリを設定します...

KVM 仮想マシンのオンライン ホット マイグレーションを実装する方法 (画像とテキスト)

1. KVM仮想マシンの移行方法と注意すべき点KVM 仮想マシンを移行する方法は 2 つあります。...

WeChatアプレットはシンプルな計算機を実装する

参考までにWeChatアプレットで書かれた簡単な計算機です。具体的な内容は次のとおりです。 jisa...

springcloud alibaba nacos linux 設定の詳細なチュートリアル

まず、github から nacos の圧縮パッケージをダウンロードします: https://git...

JavaScriptを使用して独自のAjax関数を定義する

ネイティブJSによって開始されたネットワークリクエストは、クエリ文字列の形でサーバーに送信されるため...

伝説的な VUE 構文シュガーは何をするのでしょうか?

目次1. 糖衣構文とは何ですか? 2. VUE の構文糖とは何ですか? 1. 最も一般的な構文シュガ...

HTML 5.1 学習: 14 の新機能とアプリケーション例

序文ご存知のとおり、HTML5 はインターネット コミュニティ全体に標準を提供する組織である Wor...