jQuery.data()存储在哪里?

时间:2011-04-28 15:58:18

标签: javascript jquery jquery-data

jQuery在哪里存储它为DOM对象设置的data()的值?

是否有某种类型的变量,如jQuery.dataDb或其他东西,甚至可能是私有的?

有没有办法获得对这个对象的访问权?

3 个答案:

答案 0 :(得分:32)

在内部,jQuery创建一个名为$.cache的空对象,用于存储通过数据方法设置的值。您向其添加数据的每个DOM元素都会分配一个唯一ID,该ID用作$.cache对象中的键。

答案 1 :(得分:8)

jQuery以3种不同的方式为3种不同类型的对象获取或设置数据。

对于DOM元素,jQuery首先获得一个唯一的id,而不是为名为 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通过expando搜索$ .cache并获取某个元素的数据映射,获取或设置该映射中的数据:

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
}

答案 2 :(得分:8)

好的我明白了。

jQuery.expando包含一个附加到每个元素jQuery + new Date()

的字符串

HTMLElement[jQuery.expando]包含该元素的data

的关键字

jQuery.cache[HTMLElement[$.expando]]包含元素

上的data

Here is a demo