Kapatıldığında bir iletişim kutusu tamamen nasıl kaldırılır


133

Bir ajax işlemi başarısız olduğunda, ben hatalarla yeni bir div oluşturmak ve sonra bir iletişim kutusu olarak göstermek. Diyalog kapandığında div'ı tamamen yok etmek ve kaldırmak istiyorum. Bunu nasıl yapabilirim? Kodum şu anda şöyle görünüyor:

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

Bunu çalıştırdığımda iletişim kutusu doğru bir şekilde görüntüleniyor, ancak kapattığımda iletişim kutusu html'de hala görünüyor (FireBug kullanarak). Burada ne eksik? Unuttuğum bir şey mi?

Güncelleme: Kodumun kundakçı konsolunda bana bir hata verdiğini fark ettim.

$ (this) .destroy bir işlev değil

Bana yardım edebilecek biri var mı?

Güncelleme: Sadece $(this).remove()yerine, öğe html kaldırılır. Ancak DOM'dan tamamen kaldırıldı mı? Yoksa bir şekilde önce bu yok etme işlevini de çağırmam gerekir mi?

Yanıtlar:


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

Bu, iletişim kutusunu yok eder ve ardından iletişim kutusunu "barındıran" div'i tamamen DOM'dan kaldırır.


3
FF ve Firebug açıkken bunu kullandığınız için dikkatli olun. Çökecek. code.google.com/p/fbug/issues/detail?id=6290 Kodumda neyin yanlış olduğunu anlamak için saatler geçirdim.
Hendry H.

5
Dinamik olarak oluşturulmamış DOM'dan bir div kullanıyorsanız, kullanın .empty(). Daha sonra içeriği tekrar doldurursanız tekrar kullanabilirsiniz.
KoalaBear

2
@HendryH., Artık Firefox 23.0 ve Firebug 1.11.4 ile ilgili bir sorun gibi görünmüyor.
cjm

2
destroygerekli? Elemanı kaldırmak iletişim kutusunu da yok etmeyecek mi?
Druska


10

Neden kaldırmak istiyorsun?

Birden fazla örneğin oluşturulmasını önlemekse, aşağıdaki yaklaşımı kullanın ...

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

Ve hata oluştuğunda, ...

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

Sadece daha kolay olacağını düşündüm, çünkü bir ajax çağrısından geri aldığım şeye bağlı olarak farklı içerik içerecek. Ve ayrıca div benim örneğimde gösterdiğim gibi statik değil ama github.com/nje/jquery-tmpl eklentisi tarafından oluşturuldu . Eğer iletişim kutusunun içeriğini değiştirmenin iyi bir yoluna sahipseniz, bunu görmek isterim :)
Svish

Örneğimde, div diyalogunu içeren bir dize dökümü için son derece basit bir seçenekle gittim: $ ('# myDialog'). Html ("Ooops."); Bunu div iletişim kutusundaki herhangi bir alt denetimin içeriğini değiştirmek için değiştirebilirsiniz.
Fiona - myaccessible.website

Özel olarak geçersiz kılmadıkça, tüm dialogOptions #myDialog üzerinde kalacağı için bu harika bir yaklaşım değildir. İkinci iletişim kutusu (her zaman) ilkiyle aynı düğmelere, yüksekliğe vb. Sahip olmamalıdır.
Michiel Cornille

8
$(dialogElement).empty();

$(dialogElement).remove();

bu onu gerçek anlamda düzeltir


3

Bu benim için çalıştı

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

Şerefe!

Not: Biraz benzer bir sorunum vardı ve yukarıdaki yaklaşım sorunu çözdü.


2
Close yöntemini close geri aramasının içinden çağırıyorsunuz! jQuery UI, bunun önerdiği sonsuz döngüyü önleyecek kadar akıllıdır, ancak yine de gereksizdir ve kesinlikle zarif olarak düşünmem.
Elezar

Cevabı yazarken $(this).dialog("close");, iletişim kutusu olmadan, sadece ortadan kalkmazdı. jQuery zaman zaman çok garip.
deb_

2

Benim için cazibe gibi çalışan çirkin bir çözüm:

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

4
biraz tuhaf çalışıyor. iletişim kutusunu açar ve hemen kaldırırsınız ...
Dementic

1

Kullanabilirsiniz

$(dialogElement).empty();    
$(dialogElement).remove();

0

Bu işlevi tüm js projelerimde kullanıyorum

Buna şöyle diyorsunuz: hideAndResetModals ("# IdModalDialog")

Şunları tanımlarsınız:

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');  
    });
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.