BootstrapのModalを使って、lightboxみたいに別ページを表示出来たら便利かなと思い、作ってみました。
環境
jQuery 3.3.1
Bootstrap 4.1.3
Javascript
js\plugin.js
;(function($) {
"use strict";
$.fn.modals = function(option) {
var o = $.extend({
target: "#modal",
width: 500,
height: 500
}, option);
return this.each(function() {
if ($(this).get(0) && !$(o.target).get(0)) {
$("body").append("<div id='modal' class='modal fade' tabindex='-1' role='dialog' aria-labelledby='modal' aria-hidden='true'><div class='modal-dialog modal-dialog-centered' role='document'><div class='modal-content'/></div></div>");
$("body").append("<button type='button' id='modal-close' class='modal-close' data-dismiss='modal'/>");
}
$(document).on("click", "[data-dismiss=modal]", function(event) {
if (!$(o.target).get(0)) {
$("#modal-close", window.parent.document).trigger("click");
} else {
$(o.target).modal("hide");
}
});
$(document).on("click", "[data-toggle=modal]", function(event) {
// eventじゃなくthisで取得できる
// var a = $(event.target).attr("href");
var a = $(this).attr("href");
if (typeof a !== "undefined" && a !== false) {
var b = $(o.target).find(".modal-content");
b.empty();
b.append("<iframe src='"+a+"' class='modal-frame' width='"+o.width+"' height='"+o.height+"'></iframe>");
$(o.target).modal();
}
});
});
}
})(jQuery);
HTML
親ページ
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" type="text/css" href="/path/to/css/bootstrap.min.css?v=4.1.3"/>
</head>
<body>
<p>
<a href="表示したいページのURL" data-toggle="modal">Show</a>
</p>
<script type="text/javascript" src="/path/to/js/jquery.min.js?v=3.3.1"></script>
<script type="text/javascript" src="/path/to/js/bootstrap.min.js?v=4.1.3"></script>
<script type="text/javascript" src="/path/to/js/bootstrap.bundle.min.js?v=4.1.3"></script>
<script type="text/javascript" src="/path/to/js/plugin.js"></script>
<script type="text/javascript">/*<![CDATA[*/
$(function(){
$("[data-toggle=modal]").modals();
});
/*]]>*/</script>
</body>
</html>
Modalの中に表示するページ
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" type="text/css" href="/path/to/css/bootstrap.min.css?v=4.1.3"/>
</head>
<body>
<div class="modal-header">
<h4 class="modal-title">タイトル</h4>
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
</div>
<div class="modal-body">
<p>...</p>
</div>
<script type="text/javascript" src="/path/to/js/jquery.min.js?v=3.3.1"></script>
<script type="text/javascript" src="/path/to/js/bootstrap.min.js?v=4.1.3"></script>
<script type="text/javascript" src="/path/to/js/bootstrap.bundle.min.js?v=4.1.3"></script>
<script type="text/javascript" src="/path/to/js/plugin.js"></script>
</body>
</html>
data-toggle=modal
を持つ要素が見つかったら、body内にModal用の要素を追加します。またイベント発火用のボタンも追加します。
iframe内のdata-dismiss=modal
が押されたら、親ページ内のdata-dismiss=modal
が発火します。
ボタンはCSSで見えないように調整します。
追記
[data-toggle=modal]
のクリックイベントを取得する部分で、eventじゃなくてthisで取れることに気づいたので修正しました。
参考
参考にさせていただきました。ありがとうございます。
https://qiita.com/ayies128/items/5d044bc08b9308767f4c