LoginSignup
5
13

More than 5 years have passed since last update.

BootstrapのModalで別ページを表示する

Last updated at Posted at 2018-11-01

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

5
13
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
13