【JavaScript】【Bootstrap】クリック以外のイベントでモーダルダイアログを表示するには
はじめに
CSSフレームワークとして広く知られているBootstrapを使うと、モーダルダイアログを簡単に作ることができます。ただし、表示するためには、ボタンやリンクをクリックする必要があります。
ここでは、直接ボタンやリンクをクリックするのではなく、他のイベント(onchangeなど)に反応してモーダルダイアログを表示する方法について紹介します。
Bootstrapでのモーダルダイアログの表示方法
Bootstrapを用いてモーダルダイアログを表示する方法は、検索するとたくさん見つかります。公式サイトのドキュメントを見ても簡単に実装できますので、ここでは公式からコピーしたものを掲載します。
<!-- モーダルダイアログを表示するためのボタン -->
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#exampleModal">
Launch demo modal
</button>
<!-- モーダルダイアログ本体 -->
<div class="modal" id="exampleModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">Modal title</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
...
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
<button type="button" class="btn btn-primary">Save changes</button>
</div>
</div>
</div>
</div>
モーダルダイアログを表示するには、モーダルダイアログのid
属性に対応するdata-bs-target
属性を持った<button>
や<a>
を用意し、これをクリックします。すなわち、onclick
イベントを発生させる必要があります。
クリック以外のイベントでモーダルダイアログを表示させる
次に、クリック以外のイベントでモーダルダイアログを表示させることを考えます。このようなことはあまりないかもしれませんが、たとえば、プルダウンメニューで特定の項目を選択した場合に、モーダルダイアログを表示させることが考えられます。
プルダウンメニューで特定の項目を選択したときは、onchange
イベントが発生します。前述の通り、モーダルダイアログの表示にはonclick
イベントの発生が必要なので、このままではモーダルダイアログの表示はできません。
これには、モーダルダイアログに対応した非表示の<button>
を用意し、プルダウンメニューのonchange
イベントハンドラの中で、<button>
に対してonclick
イベントを発生させるJavaScriptを書くことで対応できます。
この方法でonchange
以外のイベントにも対応させることができます。
- (HTML)
<!-- プルダウンメニュー -->
<select id="menu">
<option value="1">項目1</option>
<option value="-1">---</option>
<option value="0">項目の追加</option>
</select>
<!-- モーダルダイアログを表示するためのボタン(非表示) -->
<button type="button" id="showModal" class="btn btn-primary invisible" data-bs-toggle="modal" data-bs-target="#exampleModal">
非表示のボタン
</button>
- (JavaScript)
const showModalButton = document.getElementById("showModal");
const menu = document.getElementById("menu");
const onChange = (e) => {
if(e.target.value === "0"){
showModalButton.dispatchEvent(new Event("click"));
}
};
menu.addEventListener("change", onChange);
CodePenにコードを載せましたので、実際の動作を確認できます(CodePenの方は実際にアイテムの追加ができるようにコードを少し変えてあります)。
See the Pen
クリック以外のイベントでモーダルダイアログを表示させる by Izadori (@izadori)
on CodePen.
おわりに
Bootstrapを使ったモーダルダイアログをクリック以外のイベントで表示させる方法について説明しました。
この例のようにプルダウンメニューの特定の項目を選択したときに、モーダルダイアログを表示させたかったのですが、調べてもボタンをクリックする方法ばかり見つかるため、今回記事にしてみました。この記事が参考になれば幸いです。
ディスカッション
コメント一覧
はじめまして。突然のコメント失礼します。
ちょうど同じようなことをしていたらこのサイトに引っ掛かりました。
WEB系初心者のため、継ぎはぎでなんとか形にしようとしていたところ表示自体は同じような考えでいたのですが、モーダルでユーザ入力してもらった内容を使ったり、ボタン押下時の分岐などをjavascript内でやる方法がわかりませんでした。
こちらのコードで表示はできていますが、addを押してもitemが増えたりすることがなかったのですが、増やすところまで書いていただくことはできないでしょうか。
コメントありがとうございます。
このサイトがお役に立てたようで何よりです。
モーダルダイアログのAddを押しても何もしないのは、モーダルダイアログの表示に主眼をおいていたため、
その部分のコードを書かなかったのですが、確かに紛らわしかったかもしれません。
コード追加してみました。多分入力した内容がプルダウンメニューに追加されるようになっているはずです。
反応遅くなって申し訳ありません。
お忙しい中対応くださりありがとうございます。
参考にさせていただきます!