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