33

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

是否有某种变量之类的jQuery.dataDb东西,甚至可能是私有的?

有什么办法可以访问这个对象吗?

4

3 回答 3

35

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

于 2011-04-28T16:00:56.373 回答
10

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

最后,对于特殊的 window 对象,jQuery 在闭包中有一个特殊的windowData变量来存储 window 的数据:

function data(obj, name, value) {
    if ($.isWindow(obj)) {
        obj = windowData;
    }
    // same as data for custom object
}
于 2011-04-28T17:07:38.750 回答
9

好的,我想通了。

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

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

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

这是一个演示

于 2011-05-04T19:26:16.283 回答