Где находится 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 в элементе

вот демо