So entfernen Sie einen Dialog beim Schließen vollständig


133

Wenn eine Ajax-Operation fehlschlägt, erstelle ich ein neues Div mit den Fehlern und zeige es dann als Dialog. Wenn der Dialog geschlossen ist, möchte ich das div komplett zerstören und wieder entfernen. Wie kann ich das machen? Mein Code sieht im Moment ungefähr so ​​aus:

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

Wenn ich dies ausführe, wird das Dialogfeld korrekt angezeigt, aber wenn ich es schließe, ist das Dialogfeld weiterhin im HTML-Code sichtbar (mithilfe von FireBug). Was vermisse ich hier? Etwas was ich vergessen habe?

Update: Ich habe gerade bemerkt, dass mein Code mir einen Fehler in der Firebug-Konsole gibt.

$ (this) .destroy ist keine Funktion

Kann mir jemand helfen?

Update: Wenn ich es $(this).remove()stattdessen mache , wird das Element aus dem HTML entfernt. Aber ist es vollständig aus dem DOM entfernt? Oder muss ich diese Zerstörungsfunktion auch zuerst aufrufen?

Antworten:


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

Dadurch wird der Dialog zerstört und das Div, das den Dialog "gehostet" hat, vollständig aus dem DOM entfernt


3
Vorsicht bei Verwendung mit FF und mit geöffnetem Firebug. Es wird abstürzen. code.google.com/p/fbug/issues/detail?id=6290 Ich habe Stunden damit verbracht, herauszufinden, was mit meinem Code nicht stimmt.
Hendry H.

5
Wenn Sie ein Div aus dem DOM verwenden, das nicht dynamisch erstellt wurde, verwenden Sie .empty(). Dann können Sie es wiederverwenden, wenn Sie den Inhalt natürlich wieder füllen.
KoalaBear

2
@HendryH., Das scheint mit Firefox 23.0 und Firebug 1.11.4 kein Problem mehr zu sein.
cjm

2
Ist destroynotwendig? Wird das Entfernen des Elements nicht auch den Dialog zerstören?
Druska


10

Warum möchten Sie es entfernen?

Wenn Sie verhindern möchten, dass mehrere Instanzen erstellt werden, verwenden Sie einfach den folgenden Ansatz ...

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

Und wenn der Fehler auftritt, würden Sie tun ...

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

Ich dachte nur, es wäre einfacher, da es unterschiedliche Inhalte enthält, je nachdem, was ich von einem Ajax-Anruf zurück bekomme. Und auch das div ist nicht statisch, wie ich es in meinem Beispiel gezeigt habe, sondern wird vom Plugin github.com/nje/jquery-tmpl gerendert . Wenn Sie eine gute Möglichkeit haben, den Inhalt des Dialogs
auszutauschen,

Nun, in meinem Beispiel habe ich mich für die extrem einfache Option entschieden, einfach einen String mit dem Dialog div zu sichern: $ ('# myDialog'). Html ("Ooops."); Sie können dies ändern, um auch den Inhalt von Untersteuerelementen im Dialogfeld div zu ändern.
Fiona - myaccessible.website

Dies ist kein guter Ansatz, da alle dialogOptions im #myDialog verbleiben, sofern Sie sie nicht speziell überschreiben. Der zweite Dialog sollte (immer) nicht die gleichen Schaltflächen, die gleiche Höhe usw. haben wie der erste.
Michiel Cornille

8
$(dialogElement).empty();

$(dialogElement).remove();

das behebt es wirklich


3

Das ist für mich gearbeitet

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

Prost!

PS: Ich hatte ein etwas ähnliches Problem und der obige Ansatz hat es gelöst.


2
Sie rufen die Methode close innerhalb des Rückrufs close auf! Die jQuery-Benutzeroberfläche ist intelligent genug, um die dadurch vorgeschlagene Endlosschleife zu verhindern, aber sie ist immer noch redundant, und ich würde sie definitiv nicht als elegant betrachten.
Elezar

Zum Zeitpunkt des Schreibens der Antwort würde $(this).dialog("close");der Dialog ohne das einfach nicht verschwinden. jQuery ist manchmal sehr seltsam.
deb_

2

Eine hässliche Lösung, die für mich wie ein Zauber wirkt:

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

4
irgendwie komisch funktioniert es überhaupt. Sie öffnen den Dialog und entfernen ihn sofort ...
Dementic

1

Sie können verwenden

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

0

Ich benutze diese Funktion in allen meinen js-Projekten

Sie nennen es: hideAndResetModals ("# IdModalDialog")

Sie definieren, ob:

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');  
    });
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.