2010-05-19 18 views
118

Cuando falla una operación de ajax, creo un nuevo div con los errores y luego lo muestro como un cuadro de diálogo. Cuando el diálogo está cerrado, me gustaría destruir y eliminar completamente el div nuevamente. ¿Cómo puedo hacer esto? Mi código es algo como esto en la actualidadjquery: Cómo eliminar completamente un cuadro de diálogo al cerrar

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

Cuando corro de esta caja de diálogo se muestra correctamente, pero cuando lo cierro la ventana de diálogo es aún visible en el html (usando FireBug). ¿Que me estoy perdiendo aqui? Algo que he olvidado?

Actualización: Acaba de notar que mi código me da un error en la consola de Firebug.

$ (this) .destroy no es una función

Cualquier persona capaz de ayudarme?

Actualización: En su lugar, solo $(this).remove(), el elemento se elimina del html. ¿Pero está completamente eliminado del DOM? ¿O de alguna manera necesito llamar a esa función de destrucción primero también?

Respuesta

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

Esto destruirá el cuadro de diálogo y luego quitar el div que fue "anfitrión" los de diálogo completamente del DOM

+3

Oooooh. Derecha ... * Facepalm * ¡¡Gracias !! – Svish

+0

Tenga en cuenta que '.destroy' elimina el marcado externo agregado por el marco de la interfaz de usuario (barra de título, botón de cierre, barra de tamaño, etc.). Quizás esto es lo que quisiste decir con _host_. –

+3

antes de usar esto con FF y con Firebug abierto. Se bloqueará. https://code.google.com/p/fbug/issues/detail?id=6290 Pasé horas ... para ver qué pasaba con mi código. –

9

¿Por qué quieres eliminarlo?

Si se trata de prevenir varias instancias que se crean, a continuación, sólo tiene que utilizar el siguiente enfoque ...

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

Y cuando se produce el error, lo haría ...

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

Solo pensé que sería más fácil, ya que contendrá diferentes contenidos dependiendo de lo que obtenga de una llamada ajax. Y también el div no es estático como lo mostré en mi ejemplo, sino que lo representa el complemento http://github.com/nje/jquery-tmpl. Si tienes una buena manera de intercambiar el contenido del diálogo, me gustaría ver eso :) – Svish

+0

Bueno, en mi ejemplo, fui con la opción extremadamente simple de simplemente tirar una cadena dentro del diálogo div: $ ('#myDialog'). html ("Ooops."); Puede modificar esto para cambiar el contenido de cualquier subcontrol en el diálogo div también. –

+0

Este no es un gran enfoque, ya que todas las opciones de diálogo permanecerán en el #myDialog a menos que las anule específicamente. El segundo cuadro de diálogo no debe tener (siempre) los mismos botones, alto, etc. como el primero. –

2

Un solución fea que funciona como un encanto para mí:

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

tipo de extraño funciona en absoluto. abre el cuadro de diálogo y lo elimina inmediatamente ... – Dementic

8
$(dialogElement).empty(); 

$(dialogElement).remove(); 

esto soluciona de verdad

+0

¡Funciona para mí! ¡Gracias! – MiBol

1

Se puede hacer uso

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

Esto se trabaja para mí

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

Salud!

PD: Tuve un problema similar y el enfoque anterior lo resolvió.

+1

¡Estás llamando al método de cierre desde dentro de la devolución de llamada cercana! jQuery UI es lo suficientemente inteligente como para evitar el ciclo infinito sugerido por esto, pero sigue siendo redundante, y definitivamente no lo consideraría elegante. – Elezar

+0

En el momento de escribir la respuesta, sin el '$ (this) .dialog (" close ");', el diálogo simplemente no desaparecería. jQuery a veces es muy extraño. –

Cuestiones relacionadas