bootstrap jqueryshow.bs.modalイベントは発生しません


83

ブートストラップ3ドキュメントのモーダルの例を使用しています。モーダルは機能します。ただし、発生時にshow.bs.modalイベントにアクセスする必要があります。今のところ私は試しているだけです:

$('#myModal').on('show.bs.modal', function () {
   alert('hi')
})

何も起こらず、イベントは発生しません。私は何が間違っているのですか?これは私には意味がありません。

回答:


103

これを使って:

$(document).on('show.bs.modal','#myModal', function () {
  alert('hi');
})

8
これで私の問題は解決しました。しかし、document.ready関数の外に配置しました。document.ready内に配置すると、機能しませんでした。誰かを助けるかもしれません。
Harish Chinju 2016

2
を介して動的に作成されたajaxモーダルで完全に機能するため、これは受け入れられる答え$(data).modal('show');です。
kjdion84 2017

2
これは、ドキュメントにあるモーダルごとに発生します。特定のモーダルのみをターゲットにするには、を使用できます$(document).on('hidden.bs.modal', function (e) { if (e.target.id === 'my-modal-id') { alert('hi'); } });。ここのIDはから来ています<div class="modal fade" id="my-modal-id">
przno 2018年

2
@prznoいいえ、そうではありません。2番目の引数は、要素を指定するセレクターです。
トム

使用$(document).on(...するときは、リスナーをドキュメントコンテキストにアタッチします。これは、ターゲット要素が存在するかどうかに関係ありません。最初の引数としてイベント名を追加し、最後にコールバック機能を追加する必要がありますが、2番目の引数としてクエリセレクターを追加できます
Ali

82

on('shown.bs.modal')ポップアップするモーダルをインスタンス化する前に、必ず

$("#myModal").on("shown.bs.modal", function () { 
    alert('Hi');
});
$("#myModal").modal('show'); //This can also be $("#myModal").modal({ show: true });

または

$("#myModal").on("shown.bs.modal", function () { 
    alert('Hi');
}).modal('show');

フィールドに焦点を合わせるにはshown.bs.modal、代わりにを使用するshow.bs.modalことをお勧めしますが、他の理由で、背景の何かを非表示にしたり、モーダルが表示を開始する直前に何かを設定したりする場合は、show.bs.modal関数を使用します。


@ kjdion84-それらを作成する場所で、イベントをバインドする必要があります。`var amodal = $(" <div modal ... /> "); amodal.on(...、myfunc).modal( 'show');
ピエール

を使用する場合は、イベントをバインドする必要はありません$(document).on()
kjdion84 2017

3
^これは私の問題を解決します。また、show.bs.modalとは異なりshown.bs.modalます。前者は、モーダルが表示されようとしているときに発生します。それが示されているときの後者。大きく異なります。
福沢幸雄

@KUMARは、を呼び出すときにブートストラップが呼び出すイベントです.modal('show')。それはモーダルを求めて4つのイベントがあります:[ show.bs.modalshown.bs.modalhide.bs.modalhidden.bs.modal] -ショーは表示されたときに、示さ隠すために同じと隠され、表示するために起こっているときです。getbootstrap.com/docs/3.4/javascript/#modals-events
Pierre

18

関数を$(document).ready(function() {、またはもっと簡単に、でラップします$(function() {。CoffeeScriptでは、これは次のようになります。

$ ->
  $('#myModal').on 'show.bs.modal', (event)->

これがないと、JavaScriptはドキュメントが読み込まれる前に実行され、#myModalまだDOMの一部ではありません。これがブートストラップリファレンスです。


12
$(document).on('shown.bs.modal','.modal', function () {

/// TODO EVENTS

});

2
どういうわけか、これは私にとって最も有益な答えでした。.modalモーダルIDを参照する代わりに作業することが解決策だったようです...ありがとう!
マブ

これは非特定であり、設定されたモーダルがトリガーされるときではなく、表示されているすべてのモーダルでトリガーされるため、これが最良の回答です。
IDED

10

これを試して

$('#myModal').on('shown.bs.modal', function () {
   alert('hi');
});

shown代わりにを使用してshow、関数とアラートの最後にセミコロンがあることを確認してください。


7
'show.bs.modal'と 'shown.bs.modal'の両方が私の目的で機能するはずです。どちらも、ブートストラップドキュメントに有効なイベントとしてリストされています。それでも機能しません。
m4rlo 2013年

1
jQueryが機能していることを確認しましたか?例:$(document).ready(function(){alert( 'test');});
トレバー

はい、showイベントの外、document.ready内にアラートを配置すると、起動します。
m4rlo 2013年

1
@BassJobsen彼はhtmlでapplication.jsを2回参照しており、そのうちの1つは正しいファイルをロードしています。他は見つかりません..それは問題を引き起こしますか?
トレバー

1
@Trevorに感謝します。それは私にとってもうまくいきました。私は2つのjquery.jsを含めていました。:-p
Akshay Vishnoi 2016

7

これを追加:

$(document).ready(function(){
    $(document).on('shown.bs.modal','.modal', function () {
         // DO EVENTS
    });
});

6

同様のことが私にも起こり、setTimeoutを使用して解決しました。

Bootstrapは、次のタイムアウトを使用して表示を完了しています。

c.TRANSITION_DURATION = 300、c.BACKDROP_TRANSITION_DURATION = 150、

したがって、300以上を使用する必要があり、私にとっては200が機能しています。

$('#myModal').on('show.bs.modal', function (e) {
    setTimeout(function(){
        //Do something if necessary
    }, 300);                        
})

1
これが私が探していたものです!ブートストラップの移行期間を指摘していただきありがとうございます。賞賛:
D150

4

私の場合、.modal-dialogdivがありませんでした

イベントを発生させません:shown.bs.modal

<div id="loadingModal" class="modal fade">
  <p>Loading...</p>
</div>

火災イベントを行います:shown.bs.modal

<div id="loadingModal" class="modal fade">
  <div class="modal-dialog">      
    <p>Loading...</p>
  </div>
</div>

3

同様の問題がありましたが、$( '#myModal')を使用しても機能しません。$(window)を使用すると、動作させることができました。

私の他の問題は、モーダルdiv htmlコンテンツをのようなjavascript変数に格納した場合、showイベントが発生しないことを発見したことです。

var content="<div id='myModal' ...";
$(content).modal();
$(window).on('show.bs.modal', function (e) {
  alert('show test');
});

イベントが発生しなかったため、イベントは発生しませんでした

私の修正は、HTML本文にdivを含めることでした

<body>
    <div id='myModal'>
       ...
    </div>
    <script>
        $('#myModal).modal();
        $(window).on('show.bs.modal', function (e) {
            alert('show test');
        });
    </script>
</body>

3

スクリプトは、「js / bootstrap」の呼び出しの前ではなく、後に配置することを忘れないでください。


2

Bootstrapを使用する前に、jQueryをロードしていることを確認してください。基本的に聞こえますが、これらのモーダルイベントのキャッチに問題があり、エラーはコードにあるのではなく、jQueryの前にBootstrapをロードしていたことがわかりました。


2

次の場合、これが機能しないことがあります。

1)$('#myModal').on('show.bs.modal'...)。を使用する行の前に、Javaスクリプトコードにエラーがあります。トラブルシューティングを行うには、行の前にアラートメッセージを配置して、ページの読み込み時にアラートメッセージが表示されるかどうかを確認します。解決するには、上記のJSを削除して、どちらが問題であるかを確認します

2)もう1つの問題は、JSを間違った順序でロードした場合です。たとえば、$('#myModal').on('show.bs.modal'...)実際にJQuery.jsをロードする前にパーツを作成できます。その場合、呼び出しは無視されるため、最初にHTML(ページソースを表示してください)で、JQueryへのスクリプトリンクがモーダルonShow呼び出しの上にあるかどうかを確認してください。そうでない場合は無視されます。トラブルシューティングを行うには、前のショーの中にアラートを入れます。onShow関数内のものではなく、前のものが表示されている場合は、関数を実行できないことは明らかです。スペルが正しい場合は、JQuery.jsの呼び出しが行われていないか、onShowパーツの後に行われます。


これは私を助けまし$('#myModal').on('show.bs.modal'...)た-JQueryがロードされた後にする必要があります。ありがとう!
Ian Wold 2018

2

bootstrap4でも同じ問題が発生しました。解決策は、jQueryドキュメントのready()関数内に追加することでした。

$(document).ready(function() {
    $('#myModal').on('show.bs.modal', function () {
       alert('hi')
    })
}

1

本当にブートストラップを使用していることを確認してください別のjqueryモーダルではなくjqueryモーダル。

これであまりにも多くの時間を無駄にしました...


1

同じ問題がありました。私にとっては、jqueryを次の順序で2回ロードしたことです。

  1. ロードされたjQuery
  2. ロードされたブートストラップ
  3. jQueryを再度ロードしました

jQueryが2回目にロードされたとき、ブートストラップへの参照が何らかの理由で壊れ、モーダルが開かれましたが、on( 'shown.bs ..')メソッドは起動しませんでした。


0

私の場合、問題はtravelsizeのコメント方法でした。bootstrap.jsとjqueryの間のインポートの順序。テンプレートMetronicを使用していて、前にチェックしないため



0

これは、コードが以前に実行された可能性があり、コードが表示されない場合に発生するため、tp fireにtimeout()を追加できます。

$(document).on('shown.bs.modal', function (event) {
      setTimeout(function(){
        alert("Hi");
      },1000); 
    });

-1

以下は詳細です。

show.bs.modalは、モデルダイアログの読み込み中に機能します。show.bs.modalは、読み込み後に何かを実行するように機能しました。ポストレンダリング

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.