2010-03-15 10 views
15

Estoy un poco confundido sobre cómo jQuery almacena datos con las funciones .data().¿Cómo almacena jQuery los datos con .data()?

¿Esto es algo llamado expando? ¿O es esto usando HTML5 Web Storage aunque creo que esto es muy poco probable?

La documentación dice: Método

El .data() nos permite adjuntar datos de cualquier tipo de elementos DOM de una manera que está a salvo de referencias circulares y por lo tanto de las pérdidas de memoria.

Cuando leo acerca de expando, parece que existe el riesgo de pérdida de memoria. Lamentablemente, mis habilidades no son suficientes para leer y comprender el código jQuery en sí, pero quiero saber cómo jQuery almacena esos datos usando data().

Respuesta

16

Básicamente jQuery contiene la información que almacena/recupera con data(name, value)/data(name) y la elimina con removeData(name) en un objeto javascript interno llamado cache. El resto es solo un poco de magia javascript para que funcione y mantenga todas las asociaciones correctas.

Ah y para responder a la primera parte de su pregunta. Tampoco es expando ni HTML5 WebStorage.

Para corregirme a mí mismo, creo que jQuery usa expando en una ocasión. Establece un atributo en los elementos que utilizó data() para almacenar información en ellos. El nombre del atributo se parece a este

"jQuery" + now() //e.g. jQuery1268647073375 

btw. now() es una función interna que devuelve (new Date).getTime()

y el valor es UUID generado por jQuery.

De esta manera jQuery más tarde puede recuperar los datos asociados correctos de su caché interna.

Así que si le preocupa expandir en IE, donde recuerdo que no puede eliminarlos, entonces la fuga debe ser mínima ya que jQuery solo usa 1 expansión por elemento en el que almacena datos.A menos que llame data() en literalmente 1000 de los elementos que veo no hay problemas de memoria

1

Función data en jQuery.fn.extend es el uso de esta declaración para salvar proporcionado variables:

jQuery.cache[ id ][ name ] = data; 

jQuery.cache es sólo un objeto estándar, definido como cache: {}, dentro jQuery espacio de nombres.

Respondiendo a su pregunta: creo que jQuery almacena datos en un objeto estándar interno de JavaScript llamado cache.

Ah, y con respecto a su pregunta de pérdida de memoria - Realmente no lo sé. Si JavaScript tiene algunos problemas al almacenar referencias a elementos DOM en objetos JS estándar, esto podría ser un problema.

+0

De qué versión es esto. En 1.4.2 no hay tal línea? – jitter

+0

es de http://ajax.microsoft.com/ajax/jQuery/jquery-1.3.2.js – rochal

+1

y por cierto, incluso jQuery 1.4.2 está utilizando un objeto interno llamado caché, por lo que el servidor aún es válido. Sintaxis ligeramente diferente, pero la misma respuesta. – rochal

-4

Su puesto en caché por el navegador localmente muy parecido a una galleta

 from jquery uncompressed: 

if (data !== undefined) { 
      thisCache[ name ] = data; 
     } 
0

También puedes ver los metadata plugin - extrae los metadatos de un elemento DOM y lo devuelve como un objeto (discutido en los comentarios here).

Cuestiones relacionadas