jQuery在哪里存储它为DOM对象设置的data()
的值?
是否有某种类型的变量,如jQuery.dataDb
或其他东西,甚至可能是私有的?
有没有办法获得对这个对象的访问权?
答案 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