2011-08-17 12 views
5

El diálogo de la interfaz de usuario jQuery me lleva por las paredes. Según mi entender, así es cómo funciona:jQuery UI El diálogo se comporta de manera impredecible

Cuando lo hace $('#myDialog').dialog({...}), copia el elemento #myDialog y lo mueve dentro de este extraño elemento del widget en la parte inferior de la etiqueta de su cuerpo. ¡Esto es Loco! Duplicará elementos DOM posiblemente únicos (con ids) cuando lo haga.

Lo que intento hacer es hacer que se comporte de manera predecible cuando actualizo el HTML del elemento original (# myDialog). Si hago esto de forma dinámica, a veces el diálogo no se abre más:

http://jsfiddle.net/t67y7/3/

O a veces el diálogo se abre con el viejo HTML (porque se almacenan en caché en la parte inferior de la página de esa manera). ¿Qué pasa con esto?

Respuesta

1

¿Por qué no llamas a $ ("# dialogId") de diálogo ("destruir") en función de cierre, así:.

$("#dialogId").dialog({ 
    close: function() { 
     $(this).dialog("destroy"); 
     // you may want empty content after close if you use AJAX request to get content for dialog 
     $(this).html(''); 
    } 
} 

La destruir la función eliminará el código decorado, y su el elemento de diálogo no se duplicará la próxima vez que muestre el diálogo.

He añadido un código de muestra a jsfiddle.net example.

+0

¿Se puede publicar un ejemplo js violín con este funcionamiento? La última vez que lo intenté, la destrucción destruyó el diálogo y tuve que recrearlo. Lo cual también fue malo. – Milimetric

+0

Actualicé la respuesta con un ejemplo en js fiddle – binhgreat

+0

Hm, odio ser riguroso, pero ese ejemplo no cubre por completo el problema que publiqué aquí. Tenga en cuenta que en jsfiddle puede publicar en una solicitud echo ajax ('/ echo/html /') para simular más de cerca lo que estoy teniendo problemas. – Milimetric

5

Dado que nadie parece tener idea de cómo dominar este diálogo bestial, aquí está lo mejor que he encontrado hasta la fecha. Aceptaré cualquier alternativa superior.

var original = $('#dialogId')[0]; 
var clone = $(original).clone().attr('id', 'dialogIdClone'); 
var saveHtml = $(original).html(); 
$(original).html(''); 
$(clone).dialog({ 
    ... // other options 
    open: function(){ 
     // add any dynamic behavior you need to the dialog here 
    }, 
    close: function(){ 
     $(clone).remove(); 
     $(original).html(saveHtml); 
    } 
}); 

El propósito de esta locura es mantener el HTML del diálogo original único en la página. No estoy seguro de por qué no puede ser el comportamiento integrado del diálogo ... En realidad, no entiendo por qué jQuery UI necesita clonar el HTML para empezar.

+1

Tenía problemas con la carga dinámica de Hicharts y el segundo activador modal no mostraba el gráfico. Busqué otras posibles resoluciones, pero esta es la única que funcionó. ¡Gracias! –

+1

De nada :) No puedo creer que hasta el día de hoy mi feo truco sea aún mejor que el comportamiento de diálogo predeterminado. – Milimetric

2

Sé que esto ha sido publicado por un tiempo, pero una menos extensa manera de manejar este problema sería:

$('#your-dialog').dialog({ 
    ... // other options 
    open: function(){ 
     // add any dynamic behavior you need to the dialog here 
    }, 
    close: function(){ 

    } 
}); 
$('#your-dialog').remove(); 

Esto se debe al widget de diálogo quiere ser capaz de controlar la pantalla y se envolverá el contenido interno del diálogo original luego crea uno nuevo en la parte inferior del cuerpo.

El inconveniente de esta solución es que los diálogos deben ser los primeros en inicializarse para garantizar que todo el widget de la biblioteca de terceros funcione correctamente.

+1

Sí, esto lamentablemente no funciona si no desea perder tiempo creando diálogos al comienzo del ciclo de vida de la página. Ha pasado mucho tiempo desde que publiqué esta pregunta, ¡gracias por la respuesta! Creo que es una locura que, a pesar del largo tiempo, el problema sigue siendo el mismo y no hay señales del equipo de jQuery UI de que quieran solucionarlo. Es una de las cosas más extrañas sobre ese marco. – Milimetric

0

Debe vaciar el cuadro de diálogo antes de abrirlo.

$("#dialogId").html(''); 
$("#dialogId").dialog({ 
close: function() { 
    $(this).dialog("destroy"); 
} 
} 
Cuestiones relacionadas