Где хранится 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
}
Другие вопросы по тегам