質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
CSS3

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Bootstrap

BootstrapはウェブサイトデザインやUIのWebアプリケーションを素早く 作成する可能なCSSフレームワークです。 Twitter風のデザインを作成することができます。

Q&A

解決済

1回答

1200閲覧

【Bootstrap】プルダウンの項目クリックでモーダルを表示させたい

Mr_PONPON_MARU

総合スコア35

CSS3

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Bootstrap

BootstrapはウェブサイトデザインやUIのWebアプリケーションを素早く 作成する可能なCSSフレームワークです。 Twitter風のデザインを作成することができます。

0グッド

0クリップ

投稿2023/07/05 07:15

編集2023/07/05 07:24

実現したいこと

Bootstrap4系を用いて、プルダウンの項目をクリックすることでモーダルを表示させるようなフロントエンドを開発しています。
作成するにあたり、こちらのサイトを参考にしました。

ソースコード

当方の理解では、プルダウンの項目(<a>タグ要素)をクリックした際にはonchangeイベントが発生し、モーダルダイアログの表示にはonclickイベントが必要だと認識しています。

今回のようにプルダウンの項目クリックでモーダルを表示させる上で、モーダルダイアログを表示させるための非表示ボタンを設置しています。

article_detail.html

1<ul class="navbar-nav"> 2 <li class="nav-item dropdown"> 3 4 <!-- この画像をクリックすることでプルダウン項目表示 --> 5 <a class="nav-link" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> 6 <img class="rounded-circle u-box-shadow-sm mr-2" width="25" height="25" src="{% static 'img/three_dots_icon.png' %}" alt="Icon"> 7 </a> 8 9 <!-- プルダウン項目 --> 10 <div class="dropdown-menu" id="menu" aria-labelledby="navbarDropdown"> 11 <a class="dropdown-item" data-toggle="modal" data-target="#commentModal" id="showModal">Edit</a> 12 <!-- モーダル用非表示ボタン --> 13 <button type="button" class="btn btn-primary invisible" id="showModal" data-toggle="modal" data-target="#commentModal"> 14 Invisible Trigger Button 15 16 <a class="dropdown-item" data-toggle="modal" data-target="#commentModal" id="showModal">Delete</a> 17 <!-- モーダル用非表示ボタン --> 18 <button type="button" class="btn btn-primary invisible" id="showModal" data-toggle="modal" data-target="#commentModal"> 19 Invisible Trigger Button 20 </button> 21 22 <!-- モーダルダイアログ --> 23 <div class="modal fade bd-example-modal-lg" id="commentModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true"> 24 <div class="modal-dialog modal-lg" role="document"> 25 <div class="modal-content"> 26 <div class="modal-header"> 27 <h5 class="modal-title" id="exampleModalLabel">Large Size</h5> 28 <button type="button" class="close" data-dismiss="modal" aria-label="Close"> 29 <span aria-hidden="true">&times;</span> 30 </button> 31 </div> 32 <div class="modal-body"> 33 ... 34 </div> 35 <div class="modal-footer"> 36 <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button> 37 <button type="button" class="btn btn-primary">Save changes</button> 38 </div> 39 </div> 40 </div> 41 </div> 42 </div> 43 </li> 44</ul> 45 46-中略- 47 48<script type="text/javascript"> 49 const showModalButton = document.getElementById("showModal"); 50 const menu = document.getElementById("menu"); 51 const onChange = (e) => { 52 if(e.target.value === "0"){ 53 showModalButton.dispatchEvent(new Event("click")); 54 } 55 }; 56 menu.addEventListener("change", onChange); 57</script>

発生している問題・エラーメッセージ

プルダウン項目をクリックすると、画面がグレーアウトするところまでは良いのですが、モーダルダイアログがポップアップされません。

また、ブラウザの検証ツールを確認してみたところ、コンソール画面では下記のようなメッセージが表示されました。
イメージ説明

おそらく、const onChange = (e) => { if(e.target.value === "0"){ showModalButton.dispatchEvent(new Event("click")); } };の部分がうまくいっていないのかと思われますが訂正方法を調べてもわかりませんでした。

試したこと

・プルダウンを解除し、リンククリックのみにしたところ正常にモーダルダイアログが表示されました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2023/07/05 08:00

e.target.valueが想定の値になっているか確認はしてみましたか?
guest

回答1

0

ベストアンサー

気になるのはshowModalというIDが複数あること。
IDは同ページ内で重複不可です。別の名前にするか、同じイベントを取らせたいなら同名classを振ってイベントを付与することですかね。

つまり、

const showModalButton = document.getElementById("showModal");

ここで躓いてる可能性高いです。

ただ、モーダルの表示は別にクリックイベントにすり替える必要なくて、
https://getbootstrap.jp/docs/4.2/components/modal/
$(#hoge).modal('show')のようにすれば任意のタイミングでモーダル呼び出せたはずです。つまりmodal呼び出すためのボタンは不要。任意のタイミングで任意のモーダルを直接呼び出すことができます。
※ドキュメントのサンプルはjQueryです

投稿2023/07/05 08:02

編集2023/07/05 08:09
m.ts10806

総合スコア80888

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Mr_PONPON_MARU

2023/07/05 10:44 編集

コメントありがとうございます。ご指摘と公式ドキュメントを参考に、モーダルの呼びだしボタンを削除し、idタグ値の同一性担保と<script>タグ内のモーダル呼び出しをjsで記述してみましたが、グレーアウトするのみで、相変わらずモーダルダイアログが表示されませんでした。 ```article_detail.html <ul class="navbar-nav"> <li class="nav-item dropdown"> <!-- この画像をクリックすることでプルダウン項目表示 --> <a class="nav-link" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <img class="rounded-circle u-box-shadow-sm mr-2" width="25" height="25" src="{% static 'img/three_dots_icon.png' %}" alt="Icon"> </a> <!-- プルダウン項目 --> <div class="dropdown-menu" aria-labelledby="navbarDropdown"> <a class="dropdown-item" data-toggle="modal" data-target="#commentModal" id="showModal">Edit</a> <a class="dropdown-item" data-toggle="modal" data-target="#commentModal" id="showModal2">Delete</a> <!-- モーダルダイアログ --> <div class="modal fade bd-example-modal-lg" id="commentModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true"> <div class="modal-dialog modal-lg" role="document"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title" id="exampleModalLabel">Large Size</h5> <button type="button" class="close" data-dismiss="modal" aria-label="Close"> <span aria-hidden="true">&times;</span> </button> </div> <div class="modal-body"> ... </div> <div class="modal-footer"> <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button> <button type="button" class="btn btn-primary">Save changes</button> </div> </div> </div> </div> </div> </li> </ul> -中略- <script type="text/javascript"> $('#showModal').on('show.bs.modal', function () { $('#commentModal').modal('show'); }); </script> ``` ```$('#showModal').modal('show')```とすると、モーダル表示のトリガーとなるプルダウンメニューの項目をクリックせずとも、ページを開いた瞬間にグレーアウトしてしまいます。(グレーアウトのみでモーダルダイアログは表示されず) また、プルダウンを削除しリンククリックによる方法も確認してみたところ、モーダル呼び出し用のスクリプトを<script>タグ内に記述せずとも、もともと読み込んでいたソースファイルのみでモーダルダイアログが正常に表示されました。 当方、恥ずかしながらjsに関する知識が浅く、訂正コードのjsの記述自体が間違っている可能性もあるかもしれませんが、今一度ご意見をいただければ幸いです。
Mr_PONPON_MARU

2023/07/05 11:04

追記になります。 全ての元凶は、プルダウンのメニューの間にモーダルダイアログのhtmlを記述していたことにありました。 下記のようにすることで解決しました。 ``` <ul class="navbar-nav"> <li class="nav-item dropdown"> <a class="nav-link" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <img class="rounded-circle u-box-shadow-sm mr-2" width="25" height="25" src="{% static 'img/three_dots_icon.png' %}" alt="Icon"> </a> <div class="dropdown-menu" aria-labelledby="navbarDropdown"> <a class="dropdown-item" id="showModal" data-toggle="modal" data-target="#commentModal">Edit</a> <a class="dropdown-item" href="{% url 'article:comment_update' object.pk %}">Edit</a> <a class="dropdown-item" href="{% url 'article:comment_delete' object.pk %}">Delete</a> </div> <!-- モーダルダイアログ --> <div class="modal fade bd-example-modal-lg" id="commentModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true"> <div class="modal-dialog modal-lg" role="document"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title" id="exampleModalLabel">Large Size</h5> <button type="button" class="close" data-dismiss="modal" aria-label="Close"> <span aria-hidden="true">&times;</span> </button> </div> <div class="modal-body"> <p></p> </div> <div class="modal-footer"> <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button> <button type="button" class="btn btn-primary">Save changes</button> </div> </div> </div> </div> </li> </ul> ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問