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” 对象传入,然后分别用 .data(obj,′name1′)和.data(obj, ‘name2’) 获取附加的数据;相同,为了深入了解当中的机制,我们通过遍历 “obj” 的方式取出了隐藏的 “cache” 对象。并获得了 “cache” 对象的 “name1” 属性和 “name2” 属性的值。

能够看到,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() 存储数据的更多相关文章

  1. Core Data存储数据出错(This NSPersistentStoreCoordinator has no persistent stores (unknown))

    Core Data存储数据的时候崩溃,崩溃信息: reason: 'This NSPersistentStoreCoordinator has no persistent stores (unknow ...

  2. jQuery源码解读 - 数据缓存系统:jQuery.data

    jQuery在1.2后引入jQuery.data(数据缓存系统),主要的作用是让一组自定义的数据可以DOM元素相关联——浅显的说:就是让一个对象和一组数据一对一的关联. 一组和Element相关的数据 ...

  3. jQuery data

    大家会如何设计一个缓存呢? 一个简单的Cache (function(){ var __cache = {}, Cache = { get: function(__name){ return __ca ...

  4. jquery在元素中存储数据:data()

    转自:http://www.php.cn/js-tutorial-405445.html 在元素中存储数据:data() 1 2 3 4 5 6 7 8 9 10 <!DOCTYPE html& ...

  5. 元素的数据存储-jQuery.data()与.data()

    jQuery提供的存储接口 jQuery.data( element, key, value ) //静态接口,存数据 jQuery.data( element, key ) //静态接口,取数据 . ...

  6. jQuery.data的是jQuery的数据缓存系统

    jQuery.Data源码 jQuery.data的是jQuery的数据缓存系统 jQuery.data的是jQuery的数据缓存系统.它的主要作用就是为普通对象或者DOM元素添加数据. 1 内部存储 ...

  7. jQuery对象数据缓存Cache原理及jQuery.data详解

    网上有很多教你怎么使用jQuery.data(..)来实现数据缓存,但有两个用户经常使用的data([key],[value])和jQuery.data(element,[key],[value])几 ...

  8. iOS开发——数据持久化Swift篇&使用Core Data进行数据持久化存储

    使用Core Data进行数据持久化存储   一,Core Data介绍 1,Core Data是iOS5之后才出现的一个数据持久化存储框架,它提供了对象-关系映射(ORM)的功能,即能够将对象转化成 ...

  9. vue教程1-02 data里面存储数据

    vue教程1-02 data里面存储数据 <!DOCTYPE html> <html lang="en"> <head> <meta ch ...

随机推荐

  1. virtualwrapper使用

    1.创建: mkvirtualenv 虚拟环境目录 2.查看虚拟环境 workon lsvirtualenv 3.进入虚拟环境 workon 虚拟环境目录 4.退出虚拟环境 deactivate 5. ...

  2. js易混API汇总

    一:slice()方法 ————————————http://www.w3school.com.cn/jsref/jsref_slice_string.asp ———————————————————— ...

  3. Objective-C设计模式——单例Singleton(对象创建)

    单例 和其它语言的单例产不多,可以说是最简单的一种设计模式了.但是有几个点需要注意下,单例就是一个类只有一个实例. 所以我们要想办法阻止该类产生别的实例,一般语言中都会将构造函数写为private.但 ...

  4. Android yuv转Bitmap

      YuvImage image = new YuvImage(data, ImageFormat.NV21, size.width, size.height, null); if(image!=nu ...

  5. Angular——$http

    基本介绍 $http用于向服务端发起异步请求,同时还支持多种快捷方式如$http.get().$http.post().$http.jsonp.$hhtp也是属于内置服务的一种,这里特意提出来写一篇用 ...

  6. (转) 淘淘商城系列——redis-desktop-manager的使用

    http://blog.csdn.net/yerenyuan_pku/article/details/72849791 实际工作环境中,redis会安装在服务器上,我们想使用redis服务就要使用re ...

  7. Introduction of Version Control/Git, SVN

    什么是版本控制? 你可以把一个版本控制系统(缩写VCS)理解为一个“数据库”,在需要的时候,它可以帮你完整地保存一个项目的快照.当你需要查看一个之前的快照(称之为“版本”)时,版本控制系统可以显示出当 ...

  8. 02JavaScript基础语法及数据类型

    JavaScript基础语法及数据类型 2.1数据类型 2.1.1字符串(String) 用单引号或双引号括起来的零个或多个单一的字符所组成. 2.1.2数值(Number) 包含整数或浮点数. 2. ...

  9. Appium 的xpath定位

    Appium 的xpath定位 1.如果元素text是唯一的,可以通过text文本定位 //*[@text=’text文本属性’] # 定位text driver.find_element_by_xp ...

  10. 去重 取最大的一条sql

    select T.BILL_CODE,t.SCAN_TYPE,t.PIECE,SCAN_SITE,SCAN_MAN, row_number() over(partition by t.bill_cod ...