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