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

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

29 голосов
/ 28 апреля 2011

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

Существует ли какая-то переменная типа jQuery.dataDb или что-то, возможно, даже что-то личное?* Есть ли способ получить доступ к этому объекту?

Ответы [ 3 ]

32 голосов
/ 28 апреля 2011

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

8 голосов
/ 04 мая 2011

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

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

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

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

Вот демоверсия

8 голосов
/ 28 апреля 2011

jQuery получает или устанавливает данные тремя различными способами для трех различных типов объектов.

Для элемента DOM jQuery сначала получает уникальный идентификатор, а затем создает пользовательское свойство для элемента с именем expando * 1004.*:

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
}
...