val remove data change attribute javascript jquery jquery-data

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 }