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

推薦する

Linux teeコマンドの使い方の詳しい説明

teeコマンドは主にstandout(標準出力ストリーム、通常はコマンド実行ウィンドウ)に出力し、同...

Trash-Cli: Linux のコマンドラインごみ箱ツール

ゴミ箱は Linux ユーザー、Windows ユーザー、Mac ユーザーにとって非常に一般的なので...

Nginx プロキシ使用時にヘッダーに「_」が含まれることで情報が失われる問題の解決方法

序文ゲートウェイプロジェクトを開発する場合、署名 sign_key 情報はリクエスト時にリクエスト ...

Vue で @person 関数を実装する方法

この記事ではvueを使用し、マウスクリックイベントといくつかの小さなページの最適化を追加します。 基...

光沢のある輝くウェブサイトデザインの感動的なデザイン例

このコレクションには、あなたのデザインアイデアにインスピレーションを与える、輝いて光沢のある、優れた...

Docker はキューとタスクのスケジューリングを実現するために Laravel アプリケーションをデプロイします

前回の記事では、Docker を使用して Laravel アプリケーションをデプロイする方法について...

Tomcat の maxPostSize 設定に関する問題と注意事項

1. maxPostSize を設定する理由は何ですか? tomcat コンテナには送信データのサイ...

Vue ルーティング遅延読み込みの詳細

目次1. ルートの遅延読み込みとは何ですか? 2. ルートの遅延読み込みの使用1. ルートの遅延読み...

Centos8 システムの VMware インストール チュートリアル図 (コマンド ライン モード)

目次1. ソフトウェアとシステムイメージ2. 仮想マシンを作成する3. CentOS8をインストール...

css n番目から始まるすべての要素を取得する

具体的なコードは次のとおりです。 <div id="ボックス"> &...

scss で mixin が動作しない問題の解決方法 (ブラウザでコンパイルできない)

ミックスインメソッド: ブラウザはコンパイルできません: 以前のバージョンのsassでは上記の記述方...

VMware インストール エラー VMware Workstation が VMware 認証サービスを開始できませんでした

背景: SAP ECC サーバーをインストールし、XP をプレインストールしたいと考えています。XP...

広告を閉じるための JavaScript カウントダウン

広告を閉じるまでのカウントダウンを実装するために JavaScript を使用するまだフロントエンド...

WeChatアプレットがフォーム検証を実装

WeChatアプレットフォームの検証、参考までに具体的な内容は次のとおりです。プラグインWxVali...

リクエスト IP の最後のセグメントに基づいてトラフィックを分割するように Nginx を構成する方法

これは主に、場所パラメータのif判断の設定ジャンプです。迂回により、サーバーの負荷と圧力を軽減できま...