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