Где находится jQuery.данные () хранятся?
где jQuery хранит значения data()
что он устанавливает объекты DOM?
есть ли какая-то переменная типа jQuery.dataDb
или что-то, может быть, даже что-то личное?
есть ли способ получить доступ к этому объекту?
3 ответов
внутренне jQuery создает пустой объект с именем $.cache
, который используется для хранения значений, установленных с помощью метода данных. Каждому элементу DOM, к которому вы добавляете данные, присваивается уникальный идентификатор, который используется в качестве ключа в
jQuery получает или задает данные 3 различными способами для 3 разных типов объектов.
для элемента DOM jQuery сначала получает уникальный идентификатор, а затем создает пользовательское свойство для элемента с именем 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;
}
С другой стороны, у jQuery есть$.объект кэша, который хранит карту данных для каждого элемента, jQuery ищет $.кэш по expando и получить карту данных для определенного элемента, получение или установка данных в этой карте:
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;
}
}
для таможни объект (который не является элементом DOM или объектом window), jQuery напрямую устанавливает или получает свойство от этого объекта по имени:
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;
}
}
наконец, для специального объекта окна jQuery имеет специальный windowData переменная в закрытии для хранения данных для окна:
function data(obj, name, value) {
if ($.isWindow(obj)) {
obj = windowData;
}
// same as data for custom object
}
хорошо, я понял.
jQuery.expando
содержит строку, которая добавляется к каждому элементу, который составляет jQuery + new Date()
HTMLElement[jQuery.expando]
содержит ключ к этому элементу data
jQuery.cache[HTMLElement[$.expando]]
содержит data
в элементе