JQuery .data()如何工作的问题

我有一个关于.data()的问题。 在stackoverflow答案中,jquery将数据保存在缓存对象中,其中缓存索引以dom元素的哈希为后缀。 例如,将元素视为:

  1. #result ID,
  2. 在Jquery缓存的第3个索引中
  3. 用钥匙:“carModel”&&价值:“奥迪”

现在,我读取.data()将使用结果ID和缓存索引的哈希值保存键值。 现在我的问题是jquery如何散列dom中的任意元素?

例如,考虑以下html:

Hello World

another

test p

last

为每个分配值的代码:

 var i=0; $("p").each( function() { $(this).data("value",i); ++i; }); 

最后,让我们检索内部最p元素的值:

 alert( $("div div p").data("value") ); // output correctly => 2 

我想知道这是如何工作的? :-)我的意思是jquery如何以这样的方式对元素进行哈希处理,在这种情况下可以检索它们而没有明确的标识符(如元素ID)?

谢谢您的帮助…

jQuery数据的工作方式是将所有内部数据存储在名为cache的变量中。 每个jQuery会话创建一个“expando”,它基本上是一个随机字符串,如特定于该会话的jquery161362319162 。 它放在DOM中的每个对象上,例如element.jquery161362319162,其值为缓存中的索引。

这是一个非常基本的例子,说明它是如何工作的。 这将需要更多的工作来添加对元素上的多个数据的支持,但是您将了解它在内部如何工作。

 var cache = []; // Stores all the data for each element var uid = 'jquery89437507043'; // random generated id, // jQuery uses a function to automatically // generate such a value function data(element, key, data) { if (data !== undefined) // We are setting data { var thisCache[key] = data; cache.push(thisCache) element[uid] = cache.length; // Place the index cache // for this data set on the element } else { return cache[element[uid]][key]; } } 

用法

 var div = $('div').get(0); data(div, 'test', { 'apple': 'juice' }); alert(data(div, 'test').apple); // Will alert 'juice' 

我不确定你是否理解了你对JQUERY选择器的所作所为。

在您的示例HTML中,您嵌套了2个div,然后将一个段落放入最低级别的div中。 然后在你的JQUERY中你要求它寻找2个div和一个段落。 这就是你获得“正确”结果的原因。 这实际上与.data()无关,但事实上JQUERY没有其他任何东西可以找到,因此结果总是“正确”。

但是,如果你有一个更大的上下文,有许多没有id值的嵌套div,我不确定你会得到“正确”的结果。

我会说你最好为你的所有

分配一个id值,然后在你使用.data()时传递特定的id。

通过这种方式,您可以在创建代码时了解代码的结果。