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?

Jawaban:


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

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


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');

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


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.


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();
}
});

4
agak aneh ini bekerja sama sekali. Anda membuka dialog dan langsung menghapusnya ...
Dementic


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');  
    });
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.