Web開発の中で、モーダルウィンドウを使った動的なデータ操作はよく見られるシナリオです。
本記事では、モーダル内のiframeを活用し、クリックされた要素のデータを親ページにコピーする方法を、初心者にも分かりやすく解説します。
過去記事「Bootstrapを使って簡単にモーダル画面を表示する方法」のBootstrapを使ってiframeページをモーダル表示させ、iframe先のページ内文字要素をクリックで呼び出し元のvalueにコピーします。
以下の手順で、クリックした要素の値を呼び出し元の value にコピーする方法を説明します。
ステップ1: 親ページでのiframeの作成
まずは親ページにiframeを追加します。以下のコードを参考にしてください。
<iframe id="myIframe" src="iframe.html" width="100%" height="200"></iframe>
このiframeタグのsrc
属性には、別ページのURLを指定します。このページは後ほど作成します。
ステップ2: モーダルウィンドウの構築
次に、Bootstrapを使ってiframeをモーダルウィンドウ内に表示します。
bootstrap.min.css、bootstrap.bundle.min.jsファイルを読み込み、Bootstrapを使ってiframeページをモーダル表示させてます。
以下のコード例を親ページに追加してください。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>モーダル表示したiframe先のページ内文字要素をクリックで呼び出し元のvalueにコピーするデモページ</title>
<meta name="description" content="モーダル表示したiframe先のページ内文字要素をクリックで呼び出し元のvalueにコピーするデモページ">
<?php require_once $_SERVER['DOCUMENT_ROOT'] . '/demo/inc/head.php'; ?>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script>
</head>
<body>
<h1 class="text-center pt-5">モーダル表示したiframe先のページ内の文字要素をクリックすると、<br>以下のテキストボックスにコピーされます。</h1>
<div class="text-center pt-5">
<input type="text" id="myInput" value="" class="text-center" style="width:300px;">
</div>
<div class="text-center pt-5">
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#staticBackdrop">
モーダル画面を表示
</button>
</div>
<!-- Modal -->
<div class="modal fade" id="staticBackdrop" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="staticBackdropLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="staticBackdropLabel">モーダル画面</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<iframe id="myIframe" src="iframe.html" width="100%" height="200"></iframe>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">閉じる</button>
</div>
</div>
</div>
</div>
<script type="text/javascript">
window.addEventListener('message', function(event) {
var value = event.data;
// value を呼び出し元の要素に設定
document.getElementById('myInput').value = value;
});
</script>
</body>
</html>
ステップ3: iframe内でのクリックイベントの実装
iframeページ(iframe.html)では、クリックされた要素の値を親ページに送信する処理を実装します。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>呼出し先のiframeページ - モーダル表示したiframe先のページ内文字要素をクリックで呼び出し元のvalueにコピー</title>
<meta name="description" content="呼出し先のiframeページ - モーダル表示したiframe先のページ内文字要素をクリックで呼び出し元のvalueにコピー">
<style>
html, body {
margin: 0;
text-align: center;
font-size: 16px;
}
h1{
font-size: 16px;
padding: 0 0 20px 0;
margin: 0;
}
.copy{
width: 50%;
margin: 15px auto;
}
</style>
</head>
<body>
<h1>以下のdivまたはinputタグの文字をクリックすると、呼出し元ページにコピーします。</h1>
<div class="copy">divタグ内の文字をコピー</div>
<input type="text" class="copy" value="inputタグのvalue文字をコピー" />
<script type="text/javascript">
var copy = document.getElementsByClassName("copy");
var copys = Array.from(copy);
copys.forEach(function(target) {
target.addEventListener('click', function(event) {
var targetElement = event.target;
var valueToCopy = targetElement.textContent || targetElement.value;
parent.postMessage(valueToCopy, '*');
});
});
</script>
</body>
</html>
このコードにより、iframe内の指定した要素をクリックすると、その値が親ページに送信されます。
ステップ4: 親ページでのメッセージ受信処理
最後に、iframeから送信されたデータを親ページで受け取り、指定したフォーム要素に値をコピーします。
<script type="text/javascript">
window.addEventListener('message', function(event) {
var value = event.data;
// value を呼び出し元の要素に設定
document.getElementById('myInput').value = value;
});
</script>
このコードでは、iframeから送信されたデータを受信し、myInput
というIDを持つ要素の値に設定します。
ステップ5: 実装上の注意点
- iframeの
src
は同じドメイン内である必要があります。同一オリジンポリシーに注意してください。 - 異なるドメインの場合、CORS(Cross-Origin Resource Sharing)の設定が必要です。
- セキュリティ上、iframe間のメッセージには信頼できるデータのみを扱うべきです。
モーダル表示したiframe先のページ内文字要素をクリックで呼び出し元のvalueにコピーするデモページ
以下のリンクから、実際に動作するデモページを確認できます。
モーダル表示したiframe先のページ内文字要素をクリックで呼び出し元のvalueにコピーするデモページ
まとめ
本記事では、モーダル内のiframeを使ったデータコピーの実装方法を解説しました。この手法を応用すれば、フォームの動的入力やインタラクティブなUI構築が可能です。ぜひ試してみてください!
※流用される場合は自己責任でお願いします。
デモページheadタグ内のGoogleアナリティクスタグは流用しないで下さい。