【发布时间】:2011-08-14 20:36:00
【问题描述】:
jQuery 将其设置为 DOM 对象的 data() 的值存储在哪里?
有没有像jQuery.dataDb 之类的变量,甚至是私有变量?
有什么方法可以访问这个对象吗?
【问题讨论】:
标签: javascript jquery jquery-data
jQuery 将其设置为 DOM 对象的 data() 的值存储在哪里?
有没有像jQuery.dataDb 之类的变量,甚至是私有变量?
有什么方法可以访问这个对象吗?
【问题讨论】:
标签: javascript jquery jquery-data
在内部,jQuery 创建了一个名为$.cache 的空对象,用于存储您通过 data 方法设置的值。您向其中添加数据的每个 DOM 元素都分配有一个唯一 ID,该 ID 用作 $.cache 对象中的键。
【讨论】:
$.cache 变量。 $.cache 将(键、值)数据对存储在一起。它们不在一个单独的结构中。
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
}
【讨论】:
好的,我想通了。
jQuery.expando 包含一个附加到每个元素 jQuery + new Date() 的字符串
HTMLElement[jQuery.expando] 包含该元素的data 的键
jQuery.cache[HTMLElement[$.expando]] 包含元素上的data
【讨论】:
jQuery.data(HTMLElement) 处理所有边缘情况。