2011-11-03 12 views
10

He buscado por todas partes una respuesta, o incluso una referencia a este problema particular en vano. Estoy usando JQuery UI 1.8.7 y JQuery 1.5.1. Tengo un diálogo que quiero no solo destruir de cerca, sino también eliminar del DOM al cerrar. Esto funciona bien en Firefox. Sin embargo, cuando hago lo mismo en IE7, veo un pico de 6MB en el uso de memoria para el navegador, y esta memoria nunca se recupera hasta que apago completamente el navegador. Entonces mi primer pensamiento fue, algo en mi diálogo está causando pérdidas de memoria. Me quité todo lo que estaba añadiendo, e hice un sencillo cuadro de diálogo con el siguiente código:Massive IE7 Memory Leaks al destruir un diálogo de IU de JQuery al cerrar

$('<div id="testMe">hello</div>').dialog({ 
    modal: true, 
    autoOpen: true, 
    close: function() { $(this).dialog('destroy'); } 
}); 

Al abrir este cuadro de diálogo, ciérrela y, a continuación, actualice el navegador. Siempre termino con ~ 6MB más de memoria que antes. Si abro este diálogo, pero luego actualizo el navegador antes de cerrarlo, entonces no veo ningún pico de memoria. No tengo idea de qué podría estar causando esto: he encontrado un montón de subprocesos sobre las fugas generales de memoria de la UI de JQuery, pero ninguna de las correcciones ha hecho nada para remediar mi situación.

También pensé que quizás algún otro código en mi proyecto estaba interfiriendo. Este no es el caso: si hago lo mismo con este ejemplo de jsFiddle, ¡también recibo un pico de memoria! (http://jsfiddle.net/n68Af/1/). En este punto, no tengo idea de a dónde ir o qué más hacer. Necesito destruir estos diálogos y eliminarlos del DOM: ya hay bastantes instancias de los cuadros de diálogo en nuestra aplicación (muy grande) que se basan en el hecho de que el diálogo Div ya no se encuentra en el DOM después del cierre.

Editar: Cambiar el valor de la marca modal no tiene ningún efecto. Además, me doy cuenta de que mi ejemplo no elimina el elemento del DOM. Ya sea que lo haga o no, la fuga de memoria permanece. El código en mi proyecto real es simplemente eliminar el elemento de la dom usando $ (this) .remove(). Simplifiqué el ejemplo, porque el problema real es la llamada de "destrucción" que deja algún tipo de referencia circular o algo que está causando el pico de memoria de 6MB que mencioné.

Editar: Después de analizar esto más, no parece importar qué widget de JQuery UI estoy usando (probé Dialog, mi propio widget personalizado y Button). Mientras elimine el elemento al que hace referencia el widget desde el DOM, veo la enorme pérdida de memoria en IE7. La pérdida de memoria también ocurre si muevo los elementos a otro lugar en el DOM. Intenté crear un DIV de "cubo de basura" al que moví todos los contenidos de mi diálogo en lugar de eliminarlos por completo, y ocurrió el mismo pico.

Cualquier ayuda o dirección sería muy apreciada. Gracias de antemano chicos!

+0

Puede probar sin modal = true (lo siento no tiene IE) - como en esta pregunta SO aquí -> http://stackoverflow.com/questions/2095095/jquery-ui-dialog-memory-leaks – ManseUK

+0

Configuración modal a falso elimina un pico de memoria inicial cuando se muestra el cuadro de diálogo. Sin embargo, el aumento de ~ 6MB todavía está allí al actualizar la página web. – Adam

+0

¿Ha archivado un error en el rastreador jQuery? – Randomblue

Respuesta

2
$('<div id="testMe">hello</div>').dialog({ 
    modal: true, 
    autoOpen: true, 
    close: function() { $(this).dialog('destroy').remove(); } 
}); 

Esto eliminará por completo el diálogo desde el DOM

+0

Ver mi edición en mi publicación original. Eliminar el elemento del DOM no es el problema. El problema es por qué IE7 está obteniendo pérdidas de memoria tan grandes al destruir un diálogo – Adam

0

Por qué esto está sucediendo realmente, no estoy seguro. IE tiene un historial de bugs raros desde que comenzó IE. La mejor opción para usted es update su biblioteca jQuery a la última versión. Si esto no funciona, puedes probar y create your own dialog que no es realmente tan difícil.

El problema puede residir en el hecho de que la eliminación del elemento del DOM parece fallar. En ese caso, podría reutilizar el elemento y el objeto de diálogo para que no necesite .remove().

+0

¿Por qué el voto a favor? Si no está de acuerdo, me gustaría obtener información sobre eso. –

Cuestiones relacionadas