jQuery.data()存储在哪里?

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

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

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

在内部,jQuery创建一个名为$.cache的空对象,用于存储通过data方法设置的值。 您向其添加数据的每个DOM元素都会分配一个唯一的ID,该ID用作$.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; } } 

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

 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

这是一个演示