liberar - javascript memory
Massive IE7 Memory Leaks al destruir un diálogo de la interfaz de usuario JQuery en close (2)
He buscado por todas partes una respuesta, o incluso una referencia a este problema en particular, sin éxito. 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. Eliminé todo lo que estaba agregando e hice un diálogo simple usando el siguiente código:
$(''<div id="testMe">hello</div>'').dialog({
modal: true,
autoOpen: true,
close: function() { $(this).dialog(''destroy''); }
});
Cuando abro este diálogo, ciérralo y luego actualiza 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 tal vez 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 del indicador 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 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!
Por qué esto realmente está sucediendo, no estoy seguro. IE tiene un historial de errores extraños desde que comenzó IE. La mejor opción para usted es actualizar su biblioteca de jQuery a la última versión. Si esto no funciona, puedes intentar crear tu propio diálogo que no sea tan difícil.
El problema puede residir en el hecho de que eliminar el elemento del DOM parece fallar. En ese caso, podría reutilizar el objeto y el elemento de diálogo para no tener que .remove()
.
$(''<div id="testMe">hello</div>'').dialog({
modal: true,
autoOpen: true,
close: function() { $(this).dialog(''destroy'').remove(); }
});
Esto eliminará completamente el diálogo del DOM