Zdarzenie bootstrap jquery show.bs.modal nie zostanie uruchomione


83

Używam modalnego przykładu z dokumentacji bootstrap 3. modalne działa. jednak muszę uzyskać dostęp do zdarzenia show.bs.modal, gdy jest uruchamiane. na razie próbuję tylko:

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

Nic się nie dzieje, zdarzenie nie jest uruchamiane. Co ja robię źle??? To nie ma dla mnie sensu.

Odpowiedzi:


103

Użyj tego:

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

8
To rozwiązało mój problem. Ale umieściłem go poza funkcją document.ready. Kiedy umieściłem w document.ready, nie działało. Może komuś pomóc.
Harish Chinju

2
Powinna to być akceptowana odpowiedź, ponieważ działa doskonale z dynamicznie tworzonymi modami ajax za pośrednictwem $(data).modal('show');.
kjdion84

2
Spowoduje to uruchomienie dla każdego modalu, który masz w dokumencie. Aby kierować tylko na określony modal, którego możesz użyć $(document).on('hidden.bs.modal', function (e) { if (e.target.id === 'my-modal-id') { alert('hi'); } });. Id tu pochodzi z<div class="modal fade" id="my-modal-id">
przno

2
@przno Nie byłoby, drugim argumentem jest selektor określający element.
Tom

Kiedy używasz $(document).on(..., dołączasz swój słuchacz do kontekstu dokumentu i nie ma znaczenia, czy twoje elementy docelowe istnieją, czy nie. Powinieneś dodać nazwę zdarzenia jako pierwszy argument, a funkcję wywołania zwrotnego jako ostatni, ale możesz dodać selektor zapytania jako drugi argument
Ali

82

Upewnij się, że umieściłeś swój on('shown.bs.modal')przed utworzeniem wystąpienia modalu, aby się pojawił

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

lub

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

Aby skupić się na polu, lepiej jest użyć shown.bs.modalzamiast tego, show.bs.modalale może z innych powodów chcesz ukryć coś w tle lub ustawić coś tuż przed rozpoczęciem wyświetlania modalu, użyj show.bs.modalfunkcji.


@ kjdion84 - tam, gdzie je tworzysz, powinieneś powiązać zdarzenia. `var amodal = $ (" <div modal ... /> "); amodal.on (..., myfunc) .modal ('pokaż');
Pierre

Nie musisz wiązać żadnych wydarzeń, jeśli używasz $(document).on().
kjdion84,

3
^ To rozwiązuje mój problem. Ponadto, show.bs.modalróżni się od shown.bs.modal. Ten pierwszy uruchamia się, gdy modal ma się pokazać. To drugie, kiedy zostało pokazane. Duży inny.
Yukio Fukuzawa

@KUMAR jest to zdarzenie, które wywołuje bootstrap, gdy dzwonisz .modal('show'). Istnieją cztery imprezy Wymaga to czasowniki modalne: [ show.bs.modal, shown.bs.modal, hide.bs.modal, hidden.bs.modal] - pokazuje to, kiedy ma zamiar pokazać, pokazano, gdy jest widoczne, to samo dla skór i ukryte. getbootstrap.com/docs/3.4/javascript/#modals-events
Pierre

18

Umieść swoją funkcję w $(document).ready(function() {lub po prostu $(function() {. W CoffeeScript wyglądałoby to tak

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

Bez tego JavaScript jest wykonywany przed załadowaniem dokumentu i #myModalnie jest jeszcze częścią DOM. Oto odniesienie do Bootstrap .


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

/// TODO EVENTS

});

2
w jakiś sposób była to dla mnie najbardziej pomocna odpowiedź. wygląda na to, że rozwiązaniem była praca z .modalzamiast odwoływania się do identyfikatora modalnego ... dzięki!
mabu

Jest to najlepsza odpowiedź, ponieważ jest niespecyficzna i będzie się uruchamiać po wyświetleniu dowolnego modalu, a nie po wyzwoleniu tylko ustawionego modalu.
IDED

10

Spróbuj tego

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

Używając shownzamiast, showupewnij się, że na końcu funkcji i ostrzeżenia znajdują się średniki.


7
Zarówno „show.bs.modal”, jak i „shown.bs.modal” powinny działać do moich celów, oba są wymienione jako prawidłowe zdarzenia w dokumentach bootstrap. nadal nie działa.
m4rlo

1
Czy sprawdziłeś, że twoje jQuery działa, np. $ (Document) .ready (function () {alert ('test');});
Trevor

tak, jeśli ustawię alert poza wydarzeniem pokazu, tylko w pliku document.ready, to zostanie uruchomiony.
m4rlo

1
@BassJobsen Dwa razy odwołuje się do application.js w swoim html, jeden z nich ładuje właściwy plik. Drugiego nie znaleziono. Czy to spowodowałoby problem?
Trevor

1
Dzięki @Trevor. Mnie też się udało. Uwzględniłem 2 jquery.js. :-p
Akshay

7

Dodaj:

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

6

Przydarzyło mi się coś podobnego i rozwiązałem za pomocą setTimeout.

Bootstrap używa następującego limitu czasu do zakończenia wyświetlania:

c.TRANSITION_DURATION = 300, c.BACKDROP_TRANSITION_DURATION = 150,

Więc używanie ponad 300 musi działać, a dla mnie działa 200:

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

1
To jest to, czego szukałem! Dziękuję za wskazanie czasu trwania przejścia bootstrap! Kudos: D Nawet 150 też działa :)
ShellZero

4

W moim przypadku brakowało mi div .modal-dialog

Nie uruchamia zdarzenia: shown.bs.modal

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

Czy zdarzenie pożarowe: pokazane.bs.modalne

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

3

Miałem podobny, ale inny problem i nadal nie mogę pracować, gdy używam $ ('# myModal'). Udało mi się to uruchomić, gdy używam $ (okno).

Mój inny problem polega na tym, że stwierdziłem, że zdarzenie show nie zostanie uruchomione, jeśli przechowuję zawartość html modalnego div w zmiennej javascript, takiej jak.

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

zdarzenie nigdy nie zostało uruchomione, ponieważ nie wystąpiło

moją poprawką było włączenie elementów div w treści HTML

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


2

Upewnij się, że ładujesz jQuery przed użyciem Bootstrap. Brzmi prosto, ale miałem problemy z wychwyceniem tych zdarzeń modalnych i okazało się, że błąd nie był związany z moim kodem, ale że ładowałem Bootstrap przed jQuery.


2

Czasami to nie działa, jeśli:

1) masz błąd w kodzie skryptu java przed wierszem z $('#myModal').on('show.bs.modal'...) . Aby rozwiązać problem, umieść komunikat ostrzegawczy przed wierszem, aby sprawdzić, czy pojawia się po załadowaniu strony. Aby rozwiązać problem, usuń JS powyżej, aby zobaczyć, który z nich jest problemem

2) Innym problemem jest ładowanie JS w złej kolejności. Na przykład możesz mieć $('#myModal').on('show.bs.modal'...)część przed faktycznym załadowaniem JQuery.js. W takim przypadku wywołanie zostanie zignorowane, więc najpierw w kodzie HTML (dla pewności wyświetl źródło strony) sprawdź, czy łącze skryptu do JQuery znajduje się powyżej onShowwywołania modalnego , w przeciwnym razie zostanie zignorowane. Aby rozwiązać problem, umieść alert w programie pokazanym wcześniej. Jeśli widzisz poprzedni, a nie ten wewnątrz funkcji onShow, jasne jest, że funkcja nie może zostać wykonana. Jeśli pisownia jest poprawna, najprawdopodobniej wywołanie JQuery.js nie zostanie wykonane lub zostanie wykonane po onShowczęści


To mi pomogło - $('#myModal').on('show.bs.modal'...)musi być po załadowaniu JQuery. Dzięki!
Ian Wold

2

Miałem ten sam problem z bootstrap4. Rozwiązaniem było dodanie go wewnątrz funkcji ready () dokumentu jQuery:

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

1

Upewnij się, że naprawdę używasz modalu bootstrap jquery, a nie innego modalu jquery.

Zmarnowałem na to zbyt dużo czasu ...


1

Miałem ten sam problem. Dla mnie było to, że dwukrotnie załadowałem jquery w tej kolejności:

  1. Załadowany jQuery
  2. Załadowany plik Bootstrap
  3. Ponownie załadowano jQuery

Kiedy jQuery został załadowany po raz drugi, w jakiś sposób zepsuł odniesienia do bootstrap i modal się otworzył, ale metoda on ('shown.bs ..') nigdy nie została uruchomiona.


0

W moim przypadku problemem był komentarz travelsize .. Kolejność importu między bootstrap.js i jquery. Ponieważ używam szablonu Metronic i nie sprawdzam wcześniej



0

Dzieje się tak, gdy kod mógł zostać wykonany wcześniej i nie jest wyświetlany, więc możesz dodać do niego timeout () tp fire.

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

-1

Poniżej znajdują się szczegółowe informacje:

show.bs.modal działa podczas wczytywania okna dialogowego modelu shown.bs.modal działał, aby zrobić cokolwiek po załadowaniu. renderowanie postu

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.