javascript - remove - jquery data val
¿Dónde se almacena jQuery.data()? (3)
Internamente, jQuery crea un objeto vacío llamado $.cache
, que se utiliza para almacenar los valores que establece a través del método de datos. A cada elemento DOM al que agrega datos, se le asigna una ID única que se usa como clave en el objeto $.cache
.
¿Dónde almacena jQuery los valores de los data()
que establece en los objetos DOM?
¿Hay algún tipo de variable como jQuery.dataDb
o algo así, tal vez incluso algo privado?
¿Hay alguna manera de acceder a este objeto?
Ok, lo he descubierto.
jQuery.expando
contiene una cadena que se agrega a cada elemento que es jQuery + new Date()
HTMLElement[jQuery.expando]
contiene la clave de los data
ese elemento
jQuery.cache[HTMLElement[$.expando]]
contiene los data
del elemento
Aquí hay una demo.
jQuery obtiene o establece datos de 3 formas diferentes para 3 tipos diferentes de objetos.
Para el elemento DOM, jQuery primero obtiene un ID único, que crea una propiedad personalizada para el elemento llamado expando :
var counter = 0;
function uid() {
// only example
return ''jQuery'' + counter;
}
function getExpando(element) {
var expando = element[''jQueryExpando''];
// for those without expando, create one
if (!expando) {
expando = element[''jQueryExpando''] = uid();
}
return expando;
}
Por otro lado, jQuery tiene un objeto $ .cache que almacena el mapa de datos para cada elemento, jQuery busca $ .cache expando y obtiene un mapa de datos para cierto elemento, obteniendo o configurando datos en ese mapa:
function data(element, name, value) {
var expando = getExpando(element);
var map = $.cache[expando];
// get data
if (value === undefined) {
return map && map[name];
}
// set data
else {
// for those without any data, create a pure map
if (!map) {
map = $.cache[expando] = {};
}
map[name] = value;
return value;
}
}
Para el objeto personalizado (que no es un elemento DOM o un objeto de ventana), jQuery establece directamente u obtiene una propiedad de ese objeto por su nombre:
function data(obj, name, value) {
if (!obj) {
return obj;
}
// get data
if (value === undefined) {
return obj[name];
}
// set data
else {
obj[name] = value;
return value;
}
}
Por último, para el objeto de ventana especial, jQuery tiene una variable especial windowData en cierre para almacenar datos para ventana:
function data(obj, name, value) {
if ($.isWindow(obj)) {
obj = windowData;
}
// same as data for custom object
}