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

推薦する

CentOS7.x のアンインストールとインストール MySQL5.7 の操作手順とエンコード形式の変更方法

1. MySQL 5.7 のアンインストール1.1查看yum是否安裝過mysql CD yum li...

MySql 5.7.17 winx64 のインストールと設定に関する詳細なチュートリアル

1. ソフトウェアをダウンロードする1. MySQL の公式サイトにアクセスし、Oracle アカウ...

CSS3 カウントダウン効果

成果を達成する実装コードhtml <div クラス = 'ラッパー'> ...

MySQL デッドロック シナリオ例の分析

序文最近、MySQL で RR レベルでデッドロック問題に遭遇しました。興味深いと思ったので、調べて...

MySQLクエリ文の実行プロセスの詳細な説明

目次1. クライアントとサーバー間の通信方法2. クエリキャッシュ3. クエリ最適化処理4. クエリ...

MYSQL クエリの効率を向上させる 10 の SQL ステートメント最適化テクニック

MySQL データベースの実行効率はプログラムの実行速度に大きな影響を与えます。データベースの効率的...

Mysqlツリー再帰クエリの実装方法

序文部門テーブルなどのデータベース内のツリー構造データの場合、部門のすべての従属部門または部門のすべ...

Vue3 における親コンポーネントと子コンポーネント間の値の転送の詳細な説明

vue3 が誕生してからかなり時間が経ち、筆者も最近になって vue3 を学び始めました。 vue2...

MySQL実行計画の詳細な分析

序文前回の面接では、実行計画について質問されたとき、多くの人がそれが何なのか知りませんでした。実行計...

CSS リセットスタイルリセットの実装例

はじめに: すべてのブラウザには、「ユーザー エージェント スタイル シート」と呼ばれる、すべてのペ...

CSS コンテンツ属性を使用して、マウスホバープロンプト (ツールチップ) 効果を実現します。

なぜこのような効果を実現するのでしょうか。実は、この効果もタイトルプロンプトから派生したものですが、...

Linux サーバーでの MySQL インストール情報の表示

mysql のインストール情報を表示します。 #ps -ef | grep mysql usr/bi...

MySQL 5.7.19 インストールディレクトリに my.ini ファイルを作成する方法

前回の記事では、MySQL 5.7.19 無償インストール版 (64 ビット) の設定方法についての...

jQueryは広告の表示と非表示のアニメーションを実装します

数秒後に広告が表示されて消えることがよくあります。この機能を実装するには、JQuery フレームワー...

JavaScript は 9 グリッドのクリックによる色の変更効果を実装します

この記事では、9グリッドクリックの色変更効果を実現するためのJavaScriptの具体的なコードを参...