2010-05-19 7 views
118

Lorsqu'une opération ajax échoue, je crée une nouvelle div avec les erreurs, puis je l'affiche comme une boîte de dialogue. Lorsque la boîte de dialogue est fermée, je voudrais détruire complètement et supprimer à nouveau la div. Comment puis-je faire ceci? Mon code ressemble à ceci au moment:jquery: Comment supprimer complètement un dialogue à la fermeture

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

Quand je lance ce la boîte de dialogue affiche correctement, mais quand je le fermer la boîte de dialogue est toujours visible dans le code HTML (en utilisant Firebug). Qu'est-ce que j'oublie ici? Quelque chose que j'ai oublié?

Mise à jour: J'ai juste remarqué que mon code me donnait une erreur dans la console firebug.

$ (this) .destroy est pas une fonction

Toute personne capable de me aider?

Mise à jour: Si je ne fais que $(this).remove() à la place, l'élément est supprimé du code HTML. Mais est-il complètement retiré du DOM? Ou dois-je d'une manière ou d'une autre appeler cette fonction de destruction d'abord?

Répondre

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

Cela va détruire la boîte de dialogue puis retirez la div qui a été « hôte » la boîte de dialogue complètement du DOM

+3

Oooooh. Droit ... * facepalm * Merci !! – Svish

+0

Notez que '.destroy' supprime le balisage externe ajouté par l'infrastructure de l'interface utilisateur (barre de titre, bouton de fermeture, barre de redimensionnement, etc.). Peut-être que c'est ce que vous vouliez dire par _host_. –

+3

en utilisant ceci avec FF et avec Firebug ouvert. Il va planter. https://code.google.com/p/fbug/issues/detail?id=6290 J'ai passé des heures ... pour comprendre ce qui ne va pas avec mon code. –

9

Pourquoi voulez-vous retirer?

Si elle est d'empêcher plusieurs instances créées, puis il suffit d'utiliser l'approche suivante ...

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

Et quand l'erreur se produit, vous feriez ...

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

Je pensais juste que ce serait plus facile, car il contiendra un contenu différent en fonction de ce que je reçois d'un appel ajax. Et aussi le div n'est pas statique comme je l'ai montré dans mon exemple mais rendu par le plugin http://github.com/nje/jquery-tmpl. Si vous avez un bon moyen d'échanger le contenu de la boîte de dialogue, je serais intéressé de le voir :) – Svish

+0

Eh bien, dans mon exemple, je suis allé avec l'option extrêmement simple de simplement jeter une chaîne avec le div div: $ ('#myDialog') .html ("Ooops."); Vous pouvez également modifier cela pour modifier le contenu de tous les sous-contrôles de la div de dialogue. –

+0

Ce n'est pas une bonne approche car toutes les dialogOptions resteront sur #myDialog à moins que vous ne les écrasiez spécifiquement. La deuxième boîte de dialogue ne doit pas (toujours) avoir les mêmes boutons, hauteur, etc. que le premier. –

2

Une solution laide qui fonctionne comme un charme pour moi:

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

sorte de bizarre son travail du tout. vous ouvrez le dialogue et le retirez immédiatement ... – Dementic

8
$(dialogElement).empty(); 

$(dialogElement).remove(); 

ce qu'il fixe pour de vrai

+0

Fonctionne pour moi! Merci! – MiBol

1

Vous pouvez faire usage

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

C'est travaillé pour moi

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

Cheers!

PS: J'ai eu un problème assez similaire et l'approche ci-dessus l'a résolu.

+1

Vous appelez la méthode close depuis le rappel de fermeture! L'interface utilisateur de jQuery est assez intelligente pour empêcher la boucle infinie qui est suggérée par ceci, mais elle est toujours redondante, et je ne la considérerais certainement pas comme élégante. – Elezar

+0

Au moment de l'écriture de la réponse, sans le '$ (this) .dialog (" close ");', la boîte de dialogue ne disparaitrait tout simplement pas. jQuery est parfois très étrange. –

Questions connexes