MENU

jQueryでpostMessage()を使ってクロスドメインな親と子iframeの間で値を送受信する

今回は親と子iframeとの間で値を送受信しますが、別にiframeでなくても通信できます。IE8から使えるので、ほぼすべてのブラウザで使えると思います。JSで postMessage() を使ったサンプルは多くありますが、jQueryのサンプルはなかったので紹介します。jQueryの場合は若干違う箇所が出てくるので注意が必要です。

親から子iframeへ送信

クロスドメイン環境を想定するので、http://基準サイト.com直下にparent.htmlhttp://外部サイト.com直下にiframe.htmlを作ります。

parent.html


<!DOCTYPE html>
<html lang="ja">
<head>
  
  http://基準サイト.com/parent.html
</head>
<body>





<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script>
$(function()
{

// ボタンがクリックされたとき
$('.btn').on('click', function()
{
  // iframe内へメッセージを送信
  // postMessage(<送信する値>, <送信先のドメイン>)
  $('.child-iframe')[0].contentWindow.postMessage('任意のメッセージ', 'http://外部サイト.com');
});

});
</script>
</body>
</html>

child.html


<!DOCTYPE html>
<html lang="ja">
<head>
  
  http://外部サイト.com/iframe.html
</head>
<body>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script>
$(function()
{

// メッセージを受信したとき
$(window).on('message', function(event)
{
  // クロスサイトリクエストフォージェリ対策(送信元の検証)
  if (event.originalEvent.origin != 'http://基準サイト.com') return;
  
  // 受信したオブジェクトを表示
  console.log(event.originalEvent);
  
  // 受信したメッセージ自体を表示
  console.log(event.originalEvent.data);
});

});
</script>
</body>
</html>

子iframeから親へ送信

parent.html


<!DOCTYPE html>
<html lang="ja">
<head>
  
  http://基準サイト.com/parent.html
</head>
<body>




<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script>
$(function()
{

// メッセージを受信したとき
$(window).on('message', function(event)
{
  // クロスサイトリクエストフォージェリ対策(送信元の検証)
  if (event.originalEvent.origin != 'http://外部サイト.com') return;
  
  // 受信したオブジェクトを表示
  console.log(event.originalEvent);
  
  // 受信したメッセージ自体を表示
  console.log(event.originalEvent.data);
});


});
</script>
</body>
</html>

child.html


<!DOCTYPE html>
<html lang="ja">
<head>
  
  http://外部サイト.com/iframe.html
</head>
<body>



<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script>
$(function()
{

// ボタンがクリックされたとき
$('.btn').on('click', function()
{
  // 親へメッセージを送信
  // postMessage(<送信する値>, <送信先のドメイン>)
  window.parent.postMessage('任意のメッセージ', 'http://基準サイト.com');
});

});
</script>
</body>
</html>