Прив’яжіть функцію до Twitter Bootstrap Modal Close


530

Я використовую вкладку Twitter Bootstrap для нового проекту, і я хочу, щоб частина сторінки оновила та отримала останні дані json на модальному закритті. Я не бачу цього ніде в документації, хтось може мені це вказати чи запропонувати рішення.

Дві проблеми з використанням документованих методів

 $('#my-modal').bind('hide', function () {
   // do something ...
 });

Я додаю клас "приховати" до модального, щоб він не відображався при завантаженні сторінки, щоб завантажуватись двічі

навіть якщо я видаляю клас приховування і встановлюю ідентифікатор елемента display:noneі додаю console.log("THE MODAL CLOSED");до функції вище, коли я натискаю, закриття нічого не відбувається.

Відповіді:


1137

Запуск 3 і 4

$('#myModal').on('hidden.bs.modal', function () {
    // do something…
});

Запуск 3: getbootstrap.com/javascript/#modals-events

Запуск 4: getbootstrap.com/docs/4.1/components/modal/#events

Запуск 2.3.2

$('#myModal').on('hidden', function () {
    // do something…
});

Дивіться сторінку getbootstrap.com/2.3.2/javascript.html#modals → Події


1
Це, здається, працює, за винятком причин, коли наведення курсора на кнопку в модальному колонтитулі також спрацьовує. Кнопка - це звичайна кнопка для надсилання: <input type = "submit" class = "btn btn-info" value = "Go" /> Будь-яка ідея, як не мати загоряння події приховування при наведенні на нього? Або як я можу виявити, що його вистрілили через наведення? BTW: незважаючи на те, що подія запускається, модальне діалогове вікно не закривається.
Хлопець

2
Я не бачу такої поведінки з Bootstrap 3, ви можете скласти загадку?
sp00n

7
У цій відповіді, мабуть, слід згадати різницю між hidden.bs.modal та hid.bs.modal. Прихований запускається після завершення анімації CSS, але в моєму тестуванні, якщо немає анімації, вона ніколи не спрацьовує (хоч це може бути помилка). Якщо ви працюєте з керуванням даними, може бути безпечніше замість цього використовувати hid.bs.modal, який запускається, як тільки викликається .modal ('приховати'). getbootstrap.com/javascript/#modals-usage - Див. підрозділ "Події".
Еван Штейнкерхнер

2
Запуск 3: Він працює, коли натискаю на модальний тег, позначений як data-dismiss="modal"(як кнопка закриття), але він не працює, коли натискаю на чорну область фону, що оточує модаль. Модаль відхиляється, але потім його неможливо повторно відкрити, поки сторінка не буде оновлена. Я спробував і те, 'hidden.bs.modal'і 'hide.bs.modal'безрезультатно.
marquito

5
@marquito Що ви можете зробити (що я роблю), це використовувати так: Модаль $('#myModal').modal({ backdrop: 'static', keyboard: false });не закриється при натисканні на сіру область, а також при натисканні клавіші Esc.
aesede

123

Завантаження 4

$('#my-modal').on('hidden.bs.modal', function () {
  window.alert('hidden event fired!');
});

Дивіться цей JSFiddle на робочому прикладі:

https://jsfiddle.net/6n7bg2c9/

Дивіться розділ Модальні події в документах тут:

https://getbootstrap.com/docs/4.3/components/modal/#events


1
Для тих, хто вважає, що ця публікація хоче реалізувати цей тип зворотного виклику, є модуль розширення до Bootstrap, який включає цю функціональність, а також безліч інших корисних функцій для динамічного створення діалогів / попереджень / підтверджень: bootboxjs.com
jkriddle

@Ricardo Lima відповідь нижче - це правильний метод моніторингу подій у jQuery / bootstrap
sbonami

@meatballs досі голосує за робочий приклад. Навіть прив’язка була призупинена.
Стівен Паттен

@ 100acrewood Чувак, тепер це знахідка! Дякую! re: bootboxjs.com
Стівен Паттен

46

Запускаючи Bootstrap 3 ( редагуйте: все ще те саме в Bootstrap 4 ), є два випадки, коли ви можете запускати події, будучи:

1. Коли починається модальна подія "приховати"

$('#myModal').on('hide.bs.modal', function () { 
    console.log('Fired at start of hide event!');
});  

2. Коли модальний захід «приховати» закінчено

$('#myModal').on('hidden.bs.modal', function () {
    console.log('Fired when hide event has finished!');
});

Посилання: http://getbootstrap.com/javascript/#js-events


1
Це допомогло мені виправити мою помилку Bootstrap, де вона додала б 15px накладки-право на тіло після закриття будь-якого модального. Дякую!
Сем Малаєк

2
Добре для показу 2 подій. Початківцям, як я, краще зауважити, що це потрібно розмістити нижче модального для того, щоб подію було звільнено.
Ліннель Еммануель Нері

18

Замість "живого" вам потрібно використовувати подію "on", але призначити її об'єкту документа:

Використання:

$(document).on('hidden.bs.modal', '#Control_id', function (event) {
// code to run on closing
});

1
Ось як це потрібно зробити, якщо модаль додається динамічно. Врятувало мене тону часу.
Ділан Вандер Берг

15
$(document.body).on('hidden.bs.modal', function () {
    $('#myModal').removeData('bs.modal')
});

6

У програмі Bootstrap передбачено події, які можна підключити до модальних , наприклад, якщо ви хочете запустити подію, коли модал закінчено приховати від користувача, ви можете використовуватиподії hidden.bs.modal, як це

    /* hidden.bs.modal event example */
    $('#myModal').on('hidden.bs.modal', function () {
          window.alert('hidden event fired!');
    })

Ознайомтеся з робочою загадкою, читайте більше про модальні методи та події тут, у Документації


4

Запуск 4:

$('#myModal').on('hidden.bs.modal', function (e) {
   // call your method
})

hid.bs.modal : Ця подія запускається негайно, коли викликається метод примірника приховати.

hidden.bs.modal : Ця подія запускається, коли модаль закінчено приховати від користувача (буде чекати завершення переходів CSS).


Цей спосіб справедливий і для BS3. Будь ласка, дивіться прийняту відповідь на BS2 (застарілий) спосіб.
Роланд

3

Я б це зробив так:

$('body').on('hidden.bs.modal', '#myModal', function(){ //this call your method });

Решту вже написали інші. Я також рекомендую прочитати документацію: jquery - про метод


2

Я бачив багато відповідей щодо подій завантаження, наприклад, hide.bs.modalякі спрацьовують, коли модальний режим закривається.

Існує проблема з тими подіями: будь-які спливаючі вікна в модальному режимі (popovers, підказки тощо) спричинить цю подію.

Є ще один спосіб зловити подію, коли модаль закривається.

$(document).on('hidden','#modal:not(.in)', function(){} );

Bootstrap використовує inклас, коли модал відкритий. Дуже важливо використовувати hiddenподію, оскільки клас inвсе ще визначається при hideзапуску події .

Це рішення не працюватиме в IE8, оскільки IE8 не підтримує :not()селектор Jquery .


2

У мене були ті ж проблеми, що і з деякими

$('#myModal').on('hidden.bs.modal', function () {
// do something… })

Потрібно розмістити це внизу сторінки, розміщення його вгорі ніколи не викликає події.


Справді. Добре, що ви згадали, що його потрібно розміщувати внизу, під модалом для запуску події.
Ліннель Еммануель Нері

Я б визначив правила трохи жорсткіше, ніж це. Коли селектор jQuery $("#myModal")викликає елемент HTML з ідентифікатором myModalпотреб, який існує в DOM. Таким чином, ви могли мати цей код у верхній частині сторінки, але розміщений у межах $(document).on("ready", function(){ ... });(або подібної функції, яка викликається після заповнення DOM елементом).
Енді Джи

0

якщо ви хочете запустити функцію на кожному модальному закритті, ви можете використовувати цей метод,

$(document).ready(function (){
    $('.modal').each(function (){
        $(this).on('hidden.bs.modal', function () {
            //fires when evey popup close. Ex. resetModal();
        });
    });
});

Тому вам не потрібно кожного разу вказувати модальні ідентифікатори.

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