Cara menghapus dialog saat ditutup

133

Ketika operasi ajax gagal, saya membuat div baru dengan kesalahan dan kemudian menampilkannya sebagai dialog. Ketika dialog ditutup, saya ingin menghancurkan dan menghapus div sekali lagi. Bagaimana saya bisa melakukan ini? Kode saya terlihat seperti ini saat ini:

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

Ketika saya menjalankan ini kotak dialog muncul dengan benar, tetapi ketika saya menutupnya dialog masih terlihat di html (menggunakan FireBug). Apa yang kulewatkan di sini? Sesuatu yang saya lupa?

Pembaruan: Hanya memperhatikan kode saya memberi saya kesalahan di konsol pembakar.

$ (ini) .destroy bukan fungsi

Adakah yang bisa membantu saya?

Pembaruan: Jika saya melakukan $(this).remove()sebaliknya, item tersebut dihapus dari html. Tetapi apakah itu benar-benar dihapus dari DOM? Atau apakah saya perlu memanggil fungsi penghancuran terlebih dahulu?

Svish
sumber

Jawaban:

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

Ini akan menghancurkan dialog dan kemudian menghapus div yang "hosting" dialog sepenuhnya dari DOM

lomaxx
sumber
3
karena menggunakan ini dengan FF dan dengan Firebug dibuka. Itu akan crash. code.google.com/p/fbug/issues/detail?id=6290 Saya menghabiskan waktu berjam-jam ... untuk mencari tahu apa yang salah dengan kode saya.
Hendry H.
5
Jika Anda menggunakan div dari DOM, jadi tidak dibuat secara dinamis, gunakan .empty(). Maka Anda dapat menggunakannya kembali, jika Anda mengisi kembali konten offcourse.
KoalaBear
2
@HendryH., Yang sepertinya tidak lagi menjadi masalah dengan Firefox 23.0 dan Firebug 1.11.4.
cjm
2
Apakah destroyperlu? Tidak akan menghapus elemen juga menghancurkan dialog?
Druska
10

Mengapa Anda ingin menghapusnya?

Jika itu untuk mencegah beberapa kejadian dibuat, maka cukup gunakan pendekatan berikut ...

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

Dan ketika kesalahan terjadi, Anda akan melakukan ...

$('#myDialog').html("Ooops.");
$('#myDialog').dialog('open');
Fiona - myaccessible.website
sumber
Saya hanya berpikir itu akan lebih mudah, karena akan berisi konten yang berbeda tergantung pada apa yang saya dapatkan dari panggilan ajax. Dan juga div itu tidak statis seperti yang saya tunjukkan dalam contoh saya tetapi diberikan oleh plugin github.com/nje/jquery-tmpl . Jika Anda memiliki cara yang baik untuk menukar isi dialog saya akan tertarik melihatnya meskipun :)
Svish
Nah, dalam contoh saya, saya menggunakan opsi yang sangat sederhana yaitu hanya membuang string dengan div dialog: $ ('# myDialog'). Html ("Ooops."); Anda dapat memodifikasi ini untuk mengubah konten sub-kontrol di dalam dialog dialog juga.
Fiona - myaccessible.website
Ini bukan pendekatan yang bagus karena semua dialogOptions akan tetap ada di #myDialog kecuali Anda menimpanya secara khusus. Dialog kedua seharusnya tidak (selalu) memiliki tombol, tinggi, dll yang sama dengan yang pertama.
Michiel Cornille
8
$(dialogElement).empty();

$(dialogElement).remove();

ini memperbaikinya nyata

Ghost1
sumber
3

Ini berhasil untuk saya

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

Bersulang!

PS: Saya punya masalah yang agak mirip dan pendekatan di atas menyelesaikannya.

deb_
sumber
2
Anda memanggil metode tutup dari dalam panggilan balik dekat! jQuery UI cukup pintar untuk mencegah loop tak terbatas yang disarankan oleh ini, tapi itu masih berlebihan, dan saya pasti tidak akan menganggapnya elegan.
Elezar
Pada saat menulis jawaban, tanpa $(this).dialog("close");dialog, dialog tidak akan hilang begitu saja. jQuery terkadang sangat aneh.
deb_
2

Solusi jelek yang bekerja seperti pesona bagi saya:

$("#mydialog").dialog(
    open: function(){
        $('div.ui-widget-overlay').hide();
        $("div.ui-dialog").not(':first').remove();
}
});
cesar
sumber
4
agak aneh ini bekerja sama sekali. Anda membuka dialog dan langsung menghapusnya ...
Dementic
1

Anda bisa menggunakannya

$(dialogElement).empty();    
$(dialogElement).remove();
pengguna2994033
sumber
0

Saya menggunakan fungsi ini di semua proyek js saya

Anda menyebutnya: hideAndResetModals ("# IdModalDialog")

Anda menentukan apakah:

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');  
    });
}
Sterling Diaz
sumber