Подтвердить что ты не робот

Где хранится jQuery.data()?

Где jQuery хранит значения data(), которые он устанавливает для объектов DOM?

Есть ли какая-то переменная типа jQuery.dataDb или что-то еще, может быть, даже что-то личное?

Есть ли способ получить доступ к этому объекту?

4b9b3361

Ответ 1

Внутри jQuery создает пустой объект с именем $.cache, который используется для хранения значений, установленных с помощью метода данных. Каждому элементу DOM, к которому вы добавляете данные, присваивается уникальный идентификатор, который используется как ключ в объекте $.cache.

Ответ 2

Хорошо, я понял это.

jQuery.expando содержит строку, которая добавляется к каждому элементу, который является jQuery + new Date()

HTMLElement[jQuery.expando] содержит ключ к этому элементу data

jQuery.cache[HTMLElement[$.expando]] содержит data на элементе

Вот демонстрация

Ответ 3

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
}