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. mybatis之多个对象自动装配问题

    因为业务的需要,所以我在一个方法中植入三个对象,但是mybatis并没有自动装配,结果并不是我想的那么美好,还是报错了.报错截图如下: <select id="GetOneBillPa ...

  2. Hadoop的数据采集框架

    问题导读: Hadoop数据采集框架都有哪些? Hadoop数据采集框架异同及适用场景? Hadoop提供了一个高度容错的分布式存储系统,帮助我们实现集中式的数据分析和数据共享.在日常应用中我们比如要 ...

  3. linux下jdk与tomcat的安装与配置

    Linux中jdk与tomcat的安装与配置 1.搭建环境: (1)Linux环境:CentOS6.1 (2)jdk-1.8 (3)tomcat-9.0 2.在Linux系统上创建目录 在usr/lo ...

  4. IntelliJ IDEA jrebel 实现热部署

    前提是能够访问登陆Facebook,有Facebook的账号(我注册了一个) 点击:https://my.jrebel.com 用Facebook登陆  之后按要求填写信息 然后获取激活码 打开 id ...

  5. anime.js 实战:实现一个带有描边动画效果的复选框

    在网页或者是APP的开发中,动画运用得当可以起到锦上添花的作用.正确使用动画,不但可以有助于用户理解交互的作用,还可以大大提高网页应用的魅力和使用体验.并且在现在的网页开发中,动画已经成为了一个设计的 ...

  6. Python代码搜索并下载酷狗音乐

    运行环境: Python3.5+Pycharm 实例代码: import requests,re keyword = input("请输入想要听的歌曲:") url = " ...

  7. python __slots__ 详解(上篇)

    转自:http://blog.csdn.net/sxingming/article/details/52892640 python中的new-style class要求继承Python中的一个内建类型 ...

  8. MySQL详解(18)-----------分页方法总结

    ---方法1: 直接使用数据库提供的SQL语句---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N---适应场景: 适用于数据量较少的情况(元组百/千 ...

  9. SpringBoot(1.5.6.RELEASE)源码解析

    转自 https://www.cnblogs.com/dylan-java/p/7450914.html 启动SpringBoot,需要在入口函数所在的类上添加@SpringBootApplicati ...

  10. 网站卡测试用 PageSpeed Insights

    这个是google测试网页的;https://developers.google.com/speed/pagespeed/insights/ PageSpeed Insights 简介 PageSpe ...