jQuery.data()存储在哪里?

qwe*_*ymk 29 javascript jquery jquery-data

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

是否存在某种类似的变量jQuery.dataDb,甚至是私有的?

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

Kus*_*alP 32

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

  • +1但是,看到这个扩展会很好:1)存储的唯一ID在哪里?2)如何清除缓存?如果不使用jQuery删除附加数据的元素,是否存在"内存泄漏"? (9认同)

ota*_*tay 9

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;
}
Run Code Online (Sandbox Code Playgroud)

另一方面,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;
    }
}
Run Code Online (Sandbox Code Playgroud)

对于自定义对象(不是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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

function data(obj, name, value) {
    if ($.isWindow(obj)) {
        obj = windowData;
    }
    // same as data for custom object
}
Run Code Online (Sandbox Code Playgroud)

  • 有关更多信息:1.jQuery可以从HTML5 data-*属性获取数据,但永远不会将数据设置回属性.2. jQuery在将数据设置为object时触发*datachange*事件,但它不属于主题. (2认同)

qwe*_*ymk 8

好吧我明白了.

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

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

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

这是一个演示