як повністю знищити модальне вікно bootstrap?


83

Я використав модальне вікно для реалізації майстра, яке має близько 4,5 кроків. Мені потрібно повністю його знищити після останнього кроку (onFinish) та OnCancel, не оновлюючи сторінку . Звичайно, я можу це приховати, але приховування модальних вікон відновлює все як таке, коли я відкриваю його знову. Хтось може мені допомогти з цього питання?

Дякую Будь-які підказки відповіді корисні для мене.


2
Ви використовуєте jQuery чи щось подібне? Могли б це зробити $(modal_selector).remove().
грабіж

Дякую, дозвольте мені перевірити, працює це чи ні.
Akki

дякую, це працює, але коли ми rev = invoke не викликається modal.show () .. тоді як це повторно викликати?
Akki

Так remove, справді видалить модальний, тому його знову не можна відкрити. Модальні вікна Twitter Bootstrap насправді не є нічим чарівним, тому, коли ви знову відкриваєте модальне діалогове вікно, вам доведеться скинути всі елементи форми вручну (це був мій досвід).
грабіж

Це залежить від того, що ви відображаєте в модальному режимі. Twitter Bootstrap опрацьовує лише відображення модалів, незалежно від того, що в ньому відповідає.
грабіж

Відповіді:


120

якщо це bootstrap 3, ви можете використовувати:

$("#mimodal").on('hidden.bs.modal', function () {
    $(this).data('bs.modal', null);
});

7
Як і всі інші відповіді, це, здається, не знімає задника.
htulipe

1
@htulipe Підхід правильний, але він не буде працювати з ефектами переходу на модальний транспорт. Вам потрібно буде видалити клас .fade з модального, щоб він працював.
drillingman

3
@drillingman: +1, що спрацювало для мене:$("#mimodal").removeClass('fade').modal('hide')
Джон Гітцен,

5
Єдине, що в BS3 спрацювало для мене, було:$(this).html("");
Райан Курра

1
Як саме ви його повністю видаляєте? @Loenix
AlexioVay

41

ПРИМІТКА. Це рішення працює лише для Bootstrap до версії 3. Для відповіді на Bootstrap 3 зверніться до цього користувача 2612497 .

Що ви хочете зробити, це:

$('#modalElement').on('hidden', function(){
    $(this).data('modal', null);
});

що змусить модал ініціалізуватися кожен раз, коли його показують. Отже, якщо ви використовуєте віддалений вміст для завантаження в div або що завгодно, він буде робити це повторно кожного разу, коли його відкриватимуть. Ви просто знищуєте модальний екземпляр після кожного приховування.

Або щоразу, коли ви хочете викликати руйнування елемента (якщо насправді це не кожен раз, коли ви його приховуєте), вам просто потрібно зателефонувати до середньої лінії:

$('#modalElement').data('modal', null);

Twitter bootstrap шукає, щоб його екземпляр знаходився в атрибуті даних, якщо екземпляр існує, він просто перемикає його, якщо екземпляра не існує, він створить новий.

Сподіваюся, що це допомагає.


5
Це насправді працює, проте дещо по-іншому. $("#modalElement").removeData("modal"); Я використовую Bootstrap 2.3.1 та jQuery 1.9.1
tlavarea

5
Якщо ви використовуєте Bootstrap 3, ви повинні слухати hidden.bs.modalзамість hiddenподії. getbootstrap.com/javascript/#modals
Ромен Паулюс

19

Для версії 3.x

$( '.modal' ).modal( 'hide' ).data( 'bs.modal', null );

Для версії 2.x (ризиковано; читайте коментарі нижче) При створенні модального завантажувального модуля три елементи на вашій сторінці змінюються. Отже, якщо ви хочете повністю відмовити всі зміни, вам доведеться зробити це вручну для кожного з них.

$( '.modal' ).remove();
$( '.modal-backdrop' ).remove();
$( 'body' ).removeClass( "modal-open" );

Використання ручних кроків є ризикованим підходом, оскільки код Bootstrap може змінитися, і тоді ви можете пропустити деякі аспекти. Для прикладу, принаймні в Bootstrap 3.2 style="padding-right: 17px;"також буде встановлено body, щоб врахувати приховування смуги прокрутки. Підсумок: використовуйте Bootstraps API, який був би у v3 $('.modal').modal('hide').data('bs.modal', null);.
Олівер

Так, ти маєш рацію. Це було написано для версії 2.x. Оновлено.
zelibobla

якщо ваші дані, що динамічно вводяться в модальний, і ви видалите всю другу частину вашої відповіді, вони позбавляться набагато більше, ніж потрібно. Поза межею повторного використання модальних. Якщо це допомагає, я пропоную використовувати ваш конкретний class.remove ();
alphapilgrim

13

Таким чином ви можете повністю знищити модаль без перезавантаження сторінки.

$("#modal").remove();
$('.modal-backdrop').remove();

але це повністю видалить модальний з вашої HTML-сторінки. Після цього модальне приховування не працюватиме.


.remove () видаляє його повністю. І .show () більше не працює. Що мені знову ініціалізувати?
geeky_monster

Оскільки створення модального завантажувального внесення змін до bodyзапропонованого рішення не скасовує всі зміни.
zelibobla

2
Це не спрацює, тому що задник застряг, чому він взагалі проголосував?
codenamezero

5

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

$('#modalId').on('hidden.bs.modal', function () {
  $(this).remove();
})

Це на моїй стороні працює чудово. Версія BS> 3


Це також залишає сірий фон, а веб-сторінка залишається непридатною для використання !!
Біджу

4

Потужність jQuery. $(selector).modal('hide').destroy();спочатку видалить sinds, які можуть мати афект ковзання, а потім повністю видалить елемент, однак, якщо ви хочете, щоб користувач міг знову відкрити модаль після закінчення кроків. можливо, ви просто хочете оновити лише ті налаштування, які ви хочете скинути, тому для скидання всіх входів у вашому модальному режимі це буде виглядати наступним чином:

$(selector).find('input, textarea').each(function(){
   $(this).val('');
});

3

Наскільки я розумію, ви не хочете видалити його, ні приховати? Тому що ви можете повторно використати його пізніше .. але не хочете, щоб у ньому був старий вміст, якщо ви коли-небудь знову відкриєте його?

<div class="modal hide fade">
    <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times</button>
        <h3>Modal header</h3>
    </div>
    <div class="modal-body">
        <p>One fine body…</p>
    </div>
    <div class="modal-footer">
        <a href="#" class="btn">Close</a>
        <a href="#" class="btn btn-primary">Save changes</a>
    </div>
</div>

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

$(selector).modal({show: true})

....

$(selector).modal({show: false})
$(".modal-body").empty()

....

$(".modal-body").append("new stuff & text")
$(selector).modal({show: true})

3

bootstrap 3 + jquery 2.0.3:

$('#myModal').on('hide.bs.modal', function () {
   $('#myModal').removeData();
})

1
Оскільки створення модального завантажувального внесення змін до bodyзапропонованого рішення не скасовує всі зміни.
zelibobla

3

Якщо у вашому модалі є iframe, ви можете видалити його вміст за таким кодом:

$('#myModal').on('hidden.bs.modal', function(){
   $(this).find('iframe').html("");
   $(this).find('iframe').attr("src", "");
});

це мені допомогло;), тому мені не знадобився API для його зупинки
Alexa Adrian

2

Мій підхід полягав би у використанні clone()методу jQuery. Він створює копію вашого елемента, і це те, що ви хочете: копію вашого першого незміненого модалу, який ви можете замінити за вашим бажанням: Демо (jsfiddle)

var myBackup = $('#myModal').clone();

// Delegated events because we make a copy, and the copied button does not exist onDomReady
$('body').on('click','#myReset',function() {
    $('#myModal').modal('hide').remove();
    var myClone = myBackup.clone();
    $('body').append(myClone);
});

Розмітка, яку я використав, є найпростішою, тому вам просто потрібно прив’язати потрібні елементи / події, і вам слід скинути майстер.

Будьте обережні, щоб прив’язувати делеговані події або повторно прив’язувати при кожному скиданні внутрішні елементи вашого модального, щоб кожен новий модальний поводився однаково.



1

У мене був той самий сценарій, коли я натиснув кнопку, щоб відкрити новий модаль. Закінчивши, я хочу повністю видалити його зі своєї сторінки ... Я використовую видалення для видалення модального .. При натисканні кнопки я перевіряю, чи існує модальний, і якщо це так, я знищу його і створюю новий модальний ..

$("#wizard").click(function() {
    /* find if wizard is already open */
    if($('.wizard-modal').length) {
        $('.wizard-modal').remove();
    }
});

1
$('#myModal').on('hidden.bs.modal', function () {
      $(this).data('bs.modal', null).remove();
});

//Just add .remove(); 
//Bootstrap v3.0.3

Хоча насправді цей код може бути вирішенням проблеми, як правило, доцільно включити пояснення того, що він робить, коли відповідаєте на питання.
Себастьян Ленартович,

В порядку. Я поспішав ... у будь-якому разі додаю ".remove ();" для видалення всіх довідкових та html-кодів вашого модального завантажувального модуля.
Luca Di Lenardo

1

Це повністю видаляє модаль із DOM, працює також для "доданих" модалів.

#pickoptionmodal - це ідентифікатор мого модального вікна.

$(document).on('hidden.bs.modal','#pickoptionmodal',function(e){

e.preventDefault();

$("#pickoptionmodal").remove();

});

Після цього, чи може модаль повторно ініціалізуватися?
rahim.nagori

@ rahim.nagori, як пише в описі, видаляє модальний з DOM, ви можете повторно додати його ... не закриває модальний, видаляє його, нитка стосується повного знищення модального вікна.
Алін Разван

1

Я повинен знищити модальний відразу після його закриття натисканням кнопки, і тому я придумав наступне.

$("#closeModal").click(function() {
    $("#modal").modal('hide').on('hidden.bs.modal', function () {
        $("#modal").remove();
    });
});

Зверніть увагу, що це працює з Bootstrap 3.


1
Це також залишає сірий фон, а веб-сторінка залишається непридатною для використання !!
Біджу

1

Також працює на bootstrap 4.x

$('#modal_ID').modal( 'hide' ).data( 'bs.modal', null );

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

В якій версії завантажувального файлу ви його спробували?
Крістіан Гірба

0

Якщо модальна тінь залишається темнішою і не показує більше одного модального, це буде корисно

$('.modal').live('hide',function(){
    if($('.modal-backdrop').length>1){
        $('.modal-backdrop')[0].remove();
    }
});

1
Live застарілий, замінюється на on і [0] на елементі, на який ви націлюєтесь, не потрібен, якщо ви використовуєте jQuery. Крім того, якщо ви повністю видалите задник, зверніть увагу, що, можливо, доведеться додати його назад ... Спробуйте: $(document).on('hidden.bs.modal', '.modal', function(e) { if ($('.modal-backdrop').length) { $('.modal-backdrop').remove(); } });
Томас Беннетт

0

Мені довелося використовувати один і той же спосіб для різних кліків посилання. Я просто замінив вміст html на порожній "" тип модального способу прихованого зворотного виклику.


0

Це спрацювало для мене.

$('.modal-backdrop').removeClass('in');
$('#myDiv').removeClass('in');

Діалогове вікно та фон зникли, але вони повернулись наступного разу, коли я натиснув кнопку.


0

Це працює для Bootstrap v3.3.6

$('#dialog').modal()
.on('hide.bs.modal', function () {
    // Some Code
}).on('shown.bs.modal', function () {
    // Some Code
}).on('hidden.bs.modal', function () {
    $("#dialog").off();
});

0

тільки це працювало у мене

$('body').on('hidden.bs.modal', '.modal', function() {
    $('selector').val('');
});

Безпечно змушувати селектори робити їх порожніми, оскільки версія цієї програми для завантаження та jquery може бути причиною цієї проблеми


Це також залишає сірий фон, а веб-сторінка залишається непридатною для використання !!
Біджу


-1

З інтерфейсом користувальницького інтерфейсу це можливо для вас. Він перезавантажує контролер зблизька, щоб повторно ініціалізувати модальний вміст перед його спрацьовуванням наступного разу.

$("#myModalId").on('hidden.bs.modal', function () {
  $state.reload();  //resets the modal
});

-4

Я не знаю, як це може звучати, але це працює для мене ...........

$("#YourModalID").modal('hide');

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