Подія bootstrap jquery show.bs.modal не запускається


83

я використовую модальний приклад із bootstrap 3 docs. модальний працює. однак мені потрібно отримати доступ до події show.bs.modal, коли вона спрацьовує. наразі я просто намагаюся:

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

Нічого не відбувається, подія не запускається. Що я роблю не так ??? Для мене це не має сенсу.

Відповіді:


103

використовуй це:

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

8
Це вирішило мою проблему. Але я розмістив його поза функцією document.ready. Коли я помістив у документ. Вже, він не працював. Може допомогти комусь.
Harish Chinju

2
Це має бути прийнятою відповіддю, оскільки вона чудово працює з динамічно створеними модалями ajax через $(data).modal('show');.
kjdion84

2
Це спрацьовує для кожного способу, який є у вас на документі. Для націлювання лише на конкретний спосіб, який ви можете використовувати $(document).on('hidden.bs.modal', function (e) { if (e.target.id === 'my-modal-id') { alert('hi'); } });. Ід тут походить<div class="modal fade" id="my-modal-id">
прзно

2
@przno Ні, не було б, другий аргумент - це селектор, який вказує елемент.
Том,

Коли ви використовуєте, $(document).on(...ви приєднуєте свій слухач до контексту документа , і це не має значення, чи існує ваш цільовий елемент чи ні. Ви повинні додати назву події як перший аргумент, а зворотний виклик як останню, але ви можете додати селектор запитів як другий аргумент
Алі

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 ('шоу');
П’єр,

Якщо ви використовуєте, вам не потрібно пов’язувати будь-які події $(document).on().
kjdion84,

3
^ Це вирішує мою проблему. Крім того, show.bs.modalвідрізняється від shown.bs.modal. Перший загоряється, коли модаль ось-ось з’явиться. Останнє, коли це було показано. Великі різні.
Юкіо Фукудзава

@KUMAR - це подія, яку викликає bootstrap під час дзвінка .modal('show'). Є чотири події він закликає до модальностям: [ show.bs.modal, shown.bs.modal, hide.bs.modal, hidden.bs.modal] - шоу , коли він збирається показати, як показано , коли вона показує, те ж саме для шкіри і приховані. getbootstrap.com/docs/3.4/javascript/#modals-events
П'єр

18

Оберніть функцію $(document).ready(function() {, або більш просто, $(function() {. У CoffeeScript це могло б виглядати так

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

Без нього JavaScript виконується до завантаження документа і #myModalпоки не є частиною DOM. Ось посилання на Bootstrap .


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

/// TODO EVENTS

});

2
якось це була для мене найбільш корисна відповідь. здається, що рішення .modalзамість посилання на модальний ідентифікатор було рішенням ... дякую!
мабу,

Це найкраща відповідь, оскільки вона є неспецифічною і буде спрацьовувати на будь-якому модалі, що відображається, а не коли запускається лише встановлений модальний тригер.
IDED

10

Спробуйте це

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

Використовуючи shownзамість, showтакож переконайтеся, що в кінці функції та оповіщення у вас є крапка з комою


8
І 'show.bs.modal', і 'показано.bs.modal' повинні працювати для моїх цілей, вони обидва перелічені як дійсні події в документах завантажувального файлу. як і раніше не працює.
m4rlo

1
Ви перевірили, що ваш jQuery працює, наприклад $ (document) .ready (function () {alert ('test');});
Тревор

так, якщо я розміщу попередження поза подією шоу, просто в документі. вже, тоді воно спрацьовує.
m4rlo

1
@BassJobsen Він двічі посилається на application.js у своєму html, один із них завантажує правильний файл. Інший він не знайдений .. Це спричинило б проблему?
Тревор

1
Дякую @Trevor. Це спрацювало і у мене. Я включав 2 jquery.js. :-p
Akshay Vishnoi

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
Це те, що я шукав! Дякуємо за вказівку на тривалість переходу початкового завантаження! Слава: D Навіть 150 працює теж :)
ShellZero

4

У моєму випадку мені не вистачало div .modal-dialog

Не запускає подію: показаний.bs.modal

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

Чи пожежна подія: показано. Bs

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

3

У мене була подібна, але інша проблема, і я все ще не міг працювати, коли використовую $ ('# myModal'). Я зміг змусити його працювати, коли використовую $ (window).

Моя інша проблема полягає в тому, що я виявив, що подія show не запускатиметься, якщо я зберігатиму свій модальний div html вміст у змінній javascript, як.

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

подія ніколи не запускалася, оскільки вона не відбулася

моє виправлення полягало в тому, щоб включити div у тіло html

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


2

Переконайтеся, що ви завантажуєте jQuery, перш ніж використовувати Bootstrap. Звучить базово, але у мене були проблеми з ловом цих модальних подій, і виявляється, помилка була не в моєму коді, а в тому, що я завантажував Bootstrap перед jQuery.


2

Іноді це не працює, якщо:

1) у вас є помилка в коді сценарію Java перед вашим рядком з $('#myModal').on('show.bs.modal'...) . Для усунення несправностей поставте попереджувальне повідомлення перед рядком, щоб побачити, чи з’являється воно під час завантаження сторінки. Щоб усунути вищезазначені JS, щоб побачити, яка з них є проблемою

2) Інша проблема полягає в тому, що ви завантажуєте JS в неправильному порядку. Наприклад, ви можете отримати $('#myModal').on('show.bs.modal'...)частину перед тим, як фактично завантажити JQuery.js. У цьому випадку ваш дзвінок буде проігноровано, тому спочатку в HTML (перегляньте джерело сторінки, щоб переконатися) перевірте, чи посилання на скрипт на JQuery знаходиться вище вашого модального onShowвиклику, інакше воно буде проігноровано. Щоб усунути неполадки, помістіть попередження всередину показу на попереднє. Якщо ви бачите той, який був раніше, а не той, що знаходиться всередині функції onShow, зрозуміло, що функція не може виконуватися. Якщо написання правильне, швидше за все, ваш дзвінок до JQuery.js не зроблено або зроблено після onShowчастини


Це мені допомогло - це $('#myModal').on('show.bs.modal'...)має бути після завантаження JQuery. Дякую!
Ян Волд,

2

У мене була та ж проблема з bootstrap4. Рішенням було додати його всередину функції jQuery document ready ():

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

1

Переконайтеся, що ви дійсно використовуєте завантажувальний ремінь JQuery модальне , а не інший JQuery модальне.

Затрачено занадто багато часу на це ...


1

Був той самий випуск. Для мене це було те, що я завантажував jquery двічі в такому порядку:

  1. Завантажено jQuery
  2. Завантажений завантажувальний ремінь
  3. Знову завантажено jQuery

Коли jQuery завантажувався вдруге, він якось зламав посилання на bootstrap і модаль відкрився, але метод on ('показано.bs ..') ніколи не запускався.


0

У моєму випадку проблема полягала в тому, як розмір коментується. Порядок імпорту між bootstrap.js та jquery. Тому що я використовую шаблон Metronic і раніше не перевіряю



0

Це трапляється, коли код може виконуватися раніше, і він не відображається, тому ви можете додати тайм-аут () для його tp fire.

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

-1

Нижче наведено детальні деталі:

show.bs.modal працює під час завантаження діалогового вікна моделі. рендеринг публікації

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.