Як повністю видалити діалогове вікно закриття


133

Коли операція ajax не завершена, я створюю новий div з помилками, а потім показую його як діалог. Коли діалогове вікно закриється, я хотів би повністю знищити та видалити div ще раз. Як я можу це зробити? Наразі мій код виглядає приблизно так:

$('<div>We failed</div>')
    .dialog(
    {
        title: 'Error',
        close: function(event, ui)
        {
            $(this).destroy().remove();
        }
    });

Коли я запускаю це, діалогове вікно відображається правильно, але коли я закриваю його, діалогове вікно все ще видно в html (за допомогою FireBug). Що я тут пропускаю? Щось я забув?

Оновлення: щойно помітив, що мій код дає мені помилку в консолі firebug.

$ (це) .destroy не є функцією

Хтось може мені допомогти?

Оновлення: Якщо я роблю лише $(this).remove()замість цього, елемент видаляється з html. Але чи повністю його видалено з DOM? Або мені якось потрібно спочатку викликати цю функцію знищення?

Відповіді:


261
$(this).dialog('destroy').remove()

Це знищить діалогове вікно, а потім видалить DIV, який "розміщував" діалог повністю з DOM


3
будьте обережні, використовуючи це з FF і з відкритою Firebug. Він обвалиться. code.google.com/p/fbug/isissue/detail?id=6290 Я витратив години…, щоб зрозуміти, що не так у моєму коді.
Гендрі Х.

5
Якщо ви використовуєте div від DOM, який не створюється динамічно, використовуйте .empty(). Тоді ви можете використовувати його повторно, якщо ви знову заповнили вміст з виводу.
KoalaBear

2
@HendryH., Що, здається, більше не є проблемою з Firefox 23.0 та Firebug 1.11.4.
cjm

2
Чи destroyпотрібно? Чи не вилучення елемента також зруйнує діалогове вікно?
Друська


10

Чому ви хочете його видалити?

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

$('#myDialog') 
    .dialog( 
    { 
        title: 'Error', 
        close: function(event, ui) 
        { 
            $(this).dialog('close');
        } 
    }); 

І коли станеться помилка, ви зробите ...

$('#myDialog').html("Ooops.");
$('#myDialog').dialog('open');

Я просто думав, що це буде простіше, оскільки він буде містити різний вміст залежно від того, що я отримую від дзвінка в Ajax. А також div не є статичним, як я показав у своєму прикладі, а зроблений плагіном github.com/nje/jquery-tmpl . Якщо у вас є гарний спосіб замінити вміст діалогу, мені було б цікаво побачити це:
Свиш,

Ну, у моєму прикладі я розібрався з надзвичайно простим варіантом просто скидання рядка за допомогою діалогового div: $ ('# myDialog'). Html ("Ooops."); Ви можете змінити це, щоб змінити вміст будь-яких підконтрольних елементів у діалоговому розділі.
Fiona - myaccessible.website

Це не чудовий підхід, оскільки всі dialogOptions залишаться на #myDialog, якщо ви конкретно не перекриєте їх. У другому діалоговому вікні (не завжди) повинні бути ті ж кнопки, висота тощо., Як у першому.
Міхель Корніль


3

Це для мене працює

$('<div>We failed</div>')
    .dialog(
    {
        title: 'Error',
        close: function(event, ui)
        {
            $(this).dialog("close");
            $(this).remove();
        }
    });

Ура!

PS: У мене була дещо схожа проблема, і вищевказаний підхід вирішив її.


2
Ви викликаєте метод закриття з закритого зворотного дзвінка! Користувальницький інтерфейс jQuery досить розумний, щоб запобігти нескінченному циклу, який пропонується цим, але він все-таки зайвий, і я, безумовно, не вважав би це елегантним.
Елезар

На момент написання відповіді, без $(this).dialog("close");цього діалог просто не зникне. jQuery часом дуже дивний.
деб_

2

Потворне рішення, яке працює як шарм для мене:

$("#mydialog").dialog(
    open: function(){
        $('div.ui-widget-overlay').hide();
        $("div.ui-dialog").not(':first').remove();
}
});

4
якось дивна його робота взагалі. ви відкриєте діалогове вікно і негайно його видалите ...
Dementic


0

Я використовую цю функцію у всіх своїх js-проектах

Ви називаєте це: hidAndResetModals ("# IdModalDialog")

Ви визначаєте, чи:

function hideAndResetModals(modalID)
{
    $(modalID).modal('hide');
    clearValidation(modalID); //You implement it if you need it. If not, you can remote this line
    $(modalID).on('hidden.bs.modal', function () 
    {
        $(modalID).find('form').trigger('reset');  
    });
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.