勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

クロスドメイン環境のiframeで子フレームから親フレームに値を渡す方法

   2026/08/11  JavaScript

クロスドメインの環境でiframeを使用しており、子フレーム側から親フレーム側に値を渡し、親フレーム側にてJavaScriptで何らかの処理を行いたかった。調べたところJavaScriptのwindow.postMessageメソッドを使用するのがよさそう。以下に実装方法をメモ。

 

やりたいこと

  • クロスドメイン環境のiframeで子フレーム側のbody要素のheightの値を親フレームに送信
  • 親フレーム側でiframeタグのheightを動的に変更

 

ソースコード

親フレーム側

<iframe id="test_id_2" src="https://child.com/child.html" scrolling="no"></iframe>

<script>
//postMessageを受信した場合にreceiveSize関数を実行
window.addEventListener('message', receiveSize, false);

function receiveSize(e) {

    //オリジンが子フレーム側のドメインの場合
    if( e.origin === 'https://child.com' ){

        //iframeのheightを変更
        document.getElementById('test_id_2').style.height = `${e.data}px`;
    }
}
</script>

子フレーム側

<div id="test_id_1" style="height: 1000px; background:red;"></div>

<script>
//ページ読み込み時にpostSize関数を実行
window.addEventListener('load', postSize, false);

function postSize(e){
    let target;

    //通常の最新ブラウザの場合
    if( parent.postMessage ){
        target = parent;

    //IE8などの特殊な環境の場合
    }else if(parent.document && parent.document.postMessage) {
        target = parent.document;

    //postMessage非対応のブラウザの場合
    }else{
        target = undefined;
    }

    //postMessageに対応しておりbodyのheightが取得できている場合は送信
    if( typeof target != 'undefined' && document.body.scrollHeight ){
        target.postMessage(document.getElementById('test_id_1').scrollHeight, '*');
    }
}
</script>

クロスドメインじゃない場合

クロスドメインではなく同一ドメインで実装したいような場合はBroadcast Channel APIを使用する方がスマートに実装できそう。

 

リファレンス

Window: postMessage() method

https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage

 

参考サイト

http://d.hatena.ne.jp/bannyan/20090820/1250789189

http://sugilog.hatenablog.com/entry/20111130/1322653985

 - JavaScript

  関連記事

JavaScriptにてスワイプ可能なLightBox系ライブラリ「PhotoSwipe」の利用方法
JavaScriptにてスワイプ可能なLightBox系ライブラリ「PhotoSwipe」の利用方法

あるサイトをWappalyzerで調査していた際に「PhotoSwipe」という ...

jQueryとCSSで指定したテキストに対してラインマーカーを引く方法
jQueryとCSSで指定したテキストに対してラインマーカーを引く方法

サイト内で強調したいテキストに対して蛍光ペンでマーカーを引くようなアニメーション ...

Video.jsで再生速度及び音量の設定状況をブラウザに保存させる方法(videojs-persist)
Video.jsで再生速度及び音量の設定状況をブラウザに保存させる方法(videojs-persist)

Video.jsで再生速度及び音量を変更してもページ更新・遷移すると設定状況がリ ...

SortableJSを使ってデータの並べ替え&保存
SortableJSを使ってデータの並べ替え&保存

あるシステムを拝見した際にtableタグ内に並んでいる項目をドラッグ&ド ...

JavaScriptで画像読み込み完了のタイミングを検知する「imagesLoaded」ライブラリの利用方法
JavaScriptで画像読み込み完了のタイミングを検知する「imagesLoaded」ライブラリの利用方法

大き目のサイズの画像をページに設置すると読み込み完了まで時間がかかる。その画像が ...