jQuery.data() 的实现方式
jQuery.data() 的作用是为普通对象或 DOM Element 附加数据。 ?
??以下将分三个部分分析事实上现方式: ?
???1. ?用name和value为对象附加数据;即传入三个參数,第一个參数为须要附加数据的对象,第二个參数为数据的名称,第三个參数为数据的值。
当然,仅仅是获取值的话,也能够不传入第三个參数。 ?
???2. 用还有一个对象为对象附加数据。即传入两个參数。第一个參数为须要附加的数据对象(我们称之为“obj”),第二个參数也是一个对象(我们称之为“another”);“another”中包括的键值对将会被拷贝到 “obj” 的数据缓存(我们称之为“cache”)中。 ?
???3. 为 DOM Element 附加数据;DOM Element 也是一种 Object 。但 IE6、IE7 对直接附加在 DOM Element 上的对象的垃圾回收存在问题。因此我们将这些数据存放在全局缓存(我们称之为“globalCache”)中,即 “globalCache” 包括了多个 DOM Element 的 “cache”。并在 DOM Element 上加入一个属性,存放 “cache” 相应的 uid 。
用name和value为对象附加数据
使用 jQuery.data() 为普通对象附加数据时,其本质是将一个 “cache” 附加到了对象上,并使用了一个特殊的属性名称。
?
???存放数据的 “cache” 也是一个 object。我们为 “obj” 附加的数据实际上成为了 “cache” 的属性。而 “cache” 又是 “obj” 的一个属性,在 jQuery 1.6中,这个属性的名称是 “jQuery16”加上一个随机数(如以下提到的 “jQuery16018518865841457738” )。
我们能够用以下的代码来測试 jQuery.data() 的功能:
<script type="text/javascript" src="jquery.js"></script> ?<script> ?obj = {}; ?$.data(obj, ‘name‘, ‘value‘); ?document.write("$.data(obj, ‘name‘) = " + $.data(obj, ‘name‘) + ‘<br />‘); ?for (var key in obj) { ?????document.write("obj." + key + ‘.name = ‘ + obj[key].name); ?} ?</script>显示结果为:
$.data(obj, ‘name‘) = value ?obj.jQuery16018518865841457738.name = value ?在这段代码中,我们首先在 “obj” 上附加了一个属性(名称为“name”。值为“value”),然后通过 $.data(obj, ‘name’) 来获取所附加的数据。为了深入了解当中的实现机制,我们有使用了一个循环来获取 “obj” 的属性,实际上是取出了在 “obj” 上附加的 “cache”对象。 ?
能够看到,jQuery.data() 实际上为 “obj” 附加到了名为 “jQuery16018518865841457738” (这个名称是随机的)的对象,也就是 “cache” 上。用 jquery.data() 方式为对象附加的属性实际上成为了这个 “cache” 的属性。
用还有一个对象为对象附加数据
除了以提供 name 和 value 的方式进行赋值。我们还能够直接传入还有一个对象( “another” )作为參数。这样的情况下,“another” 的属性名称和属性值将被视为多个键值对。从中提取的 “name” 和 “value” 都会被拷贝到目标对象的缓存中。 ?
功能測试代码例如以下:
<script type="text/javascript" src="jquery.js"></script> ?<script> ?obj = {}; ?$.data(obj, {name1: ‘value1‘, name2: ‘value2‘}); ?document.write("$.data(obj, ‘name1‘) = " + $.data(obj, ‘name1‘) ?+ ‘<br />‘ ); ?document.write("$.data(obj, ‘name2‘) = " + $.data(obj, ‘name2‘) + ‘<br />‘); ?for (var key in obj) { ?????document.write("obj." + key + ‘.name1 = ‘ + obj[key].name1 + ‘<br />‘); ?????document.write("obj." + key + ‘.name2 = ‘ + obj[key].name2); ?} ?</script> ?显示结果例如以下:
$.data(obj, ‘name1‘) = value1 ?$.data(obj, ‘name2‘) = value2 ?obj.jQuery1600233050178663064.name1 = value1 ?obj.jQuery1600233050178663064.name2 = value2 ?以上測试代码中,我们先将一个带有两个键值对的 “another” 对象传入,然后分别用
能够看到,jQuery.data() 实际上为 “obj” 附加了名为 “obj.jQuery1600233050178663064” 的对象,也就是 “cache” 上。用 jquery.data() 方式传入的键值对都被拷贝到了 “cache” 中。为 DOM Element 附加数据
因为 DOM Element 也是一种 Object,因此之前的方式也能够为 DOM Element 赋值。但考虑到 IE6、IE7 中垃圾回收的问题(不能有效回收 DOM Element 上附加的对象引用)。jQuery採用了与普通对象有所不同的方式附加数据。
測试代码例如以下:
<div id="div_test" /> ?<script type="text/javascript" src="data.js"></script> ?<script> ?window.onload = function() { ?????div = document.getElementById(‘div_test‘); ?????$.data(div, ‘name‘, ‘value‘); ?????document.write($.data(div, ‘name‘)); ?} ?</script> ?显示结果例如以下:
value測试代码中,首先通过 document.getElementById 方法获取了一个 DOM Element (当然,也能够用 jQuery 的选择器),然后在这个 DOM Element 上附加了一个属性。随后就从 DOM Element 上取出了附加的属性并输出。 ???????????????jQuery.data() 存储数据
原文地址:https://www.cnblogs.com/zhchoutai/p/8510816.html