勉強したことのメモ

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で画像を取り扱う際の注意
javascriptで画像を取り扱う際の注意

javascriptで画像を取り扱う際に、 ちゃんと要素を指定しているのにも関わ ...

Push.jsを用いてプッシュ通知を実装&Web Audio APIで通知音も鳴らす方法
Push.jsを用いてプッシュ通知を実装&Web Audio APIで通知音も鳴らす方法

プッシュ通知(デスクトップ通知)を実装してみたい。また、通知の際は分かりやすいよ ...

架空の地図画像をLeafletを用いてWeb上でマップ表示する方法
架空の地図画像をLeafletを用いてWeb上でマップ表示する方法

ゲーム攻略サイト等でゲーム内の地図をWeb上で表示し、マーカーを立てたりマウスホ ...

バニラJS対応(jQuery非依存)の画像遅延読み込みライブラリ「lazysizes」の利用方法
バニラJS対応(jQuery非依存)の画像遅延読み込みライブラリ「lazysizes」の利用方法

あるサイトのコーディングデータを貰った際に「lazysizes」というJavaS ...

3Dデータ(objファイル)をブラウザ上で表示する方法(JSC3D)
3Dデータ(objファイル)をブラウザ上で表示する方法(JSC3D)

3Dデータをブラウザで表示させて、違う方向から見たり、縮小拡大をしたいという案件 ...