2009-06-29 13 views
7

¿Debo emparejar todas las llamadas a data() con una llamada a removeData() posterior?¿Qué tipo de pérdidas de memoria debo vigilar con los datos de jQuery()?

Mis suposiciones: jQuery's remove() eliminará elementos del DOM, y si no tengo otras referencias para eliminar, no tengo que hacer más tareas de limpieza.

Sin embargo, si tengo algo de JavaScript var u objeto en referencia a uno de los elementos que se eliminan, voy a tener que limpiar eso, y yo estoy asumiendo que se aplica a la función de los datos de jQuery, también, porque es haciendo referencia a los elementos de alguna manera.

Entonces, si necesito llamar a removeData antes de eliminar, ¿hay un atajo para eliminar todos los datos asociados con un elemento o tengo que llamar a cada uno explícitamente por su nombre?

Editar: Revisé el código fuente y confirmé lo que dijeron Borgar y roosteronacid. Quitar elimina los elementos del dom y elimina los eventos y datos almacenados con ellos, lo cual es conveniente, pero me hace preguntarme cuándo utilizaría removeData(). Probablemente no a menudo.

Respuesta

14

Los datos de jQuery no guardan una referencia al elemento por lo que no tiene que preocuparse por pérdidas de memoria. Su propósito previsto es resolver este problema exacto.

Una ligera simplificación de cómo funciona:

Un miembro de identificación se añaden a cada "tocado" nodo DOM. Todas las acciones posteriores que involucran ese elemento DOM usan esa identificación.

var theNode = document.getElementById('examplenode'); 
theNode[ 'jQuery' + timestamp ] = someInternalNodeID; 

Puede acceder a la identificación utilizando la misma función utiliza jQuery:

someInternalID = jQuery.data(document.body); 

Cuando anexa datos al nodo que almacena en el objeto jQuery, archivada en ID interno del nodo.Su $(element).data(key,value) traduce internamente a algo como:

jQuery.cache[ someInternalNodeID ][ theKey ] = theValue; 

Todo va en la misma estructura, incluyendo los controladores de eventos:

jQuery.cache[ someInternalNodeID ][ 'events' ][ 'click' ] = theHandler; 

Cuando se elimina un elemento, jQuery, por tanto, puede tirar todos los datos (y la manejadores de eventos) con una operación sencilla:

delete jQuery.cache[ someInternalNodeID ]; 

En teoría, es posible que por lo tanto también eliminar jQuery sin fugas que se producen a partir de una y referencias. jQuery incluso admite múltiples instancias separadas de la biblioteca, cada una con su propio conjunto de datos o eventos.

Puede ver a John Resig explicando esto en the "The DOM Is a Mess" presentation.

+5

Los lectores deben tener en cuenta que esto solo es seguro si usa el método '.remove()' de jQuery, que hace que los datos almacenados se limpien. Si elimina los elementos del DOM usted mismo, jQuery no sabrá que lo limpia y tendrá una fuga hasta que la página se cierre. –

0

En general, javascript es bastante bueno para saber cuándo es apropiado recoger la basura y, a menos que esté escribiendo aplicaciones de cliente a gran escala o de larga ejecución, diría que la memoria involucrada es principalmente Inconsecuente y tratando de adivinar que no va a ganar mucho.

Determinar qué cierres léxicos inacabados u otros javascript difíciles en jQuery aún pueden estar accediendo a sus datos puede ser bastante complicado en algunos casos.

Por lo que yo sé, sin embargo, si almacena una referencia a lo que usted tiene con la función de los datos de jQuery entonces sería seguir existiendo después de retirar el elemento, por lo que eliminar esa referencia sería necesario, así . Algunos casos de prueba simples le darían una respuesta más definitiva.

2

El punto de jQuery es abstraer lejos de las implementaciones de JavaScript cutres y errores en los navegadores .. tales como pérdidas de memoria :)

.. Sí; todos los datos asociados a un elemento se eliminarán cuando ese elemento se elimine del DOM.

Cuestiones relacionadas