博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
读jQuery之六(缓存数据)
阅读量:4654 次
发布时间:2019-06-09

本文共 3539 字,大约阅读时间需要 11 分钟。

很多同学在项目中都喜欢将数据存储在HTMLElement属性上,如

1
2
3
4
<div data=
"some data"
>Test</div>
<script>
    
div.getAttribute(
'data'
); 
// some data
</script>

给页面中div添加了自定义属性“data”及值“some data”。后续JS代码中使用getAttribute获取。

 

jQuery从1.2.3开始提供了data/removeData方法用来存储/删除数据。1.6.1代码片段

1
2
3
4
5
6
jQuery.extend({
    
cache: {},
    
// Please use with caution
    
uuid: 0,
    
...
});

即给jQuery添加了静态字段/方法,有jQuery.cache/jQuery.uuid/jQuery.expando等。下面分别介绍

jQuery.cache 空对象,用来缓存。它的结构较复杂。

jQuery.uuid 自增唯一的数字。

jQuery.expando 字符串,使用Math.random生成,去掉了非数字字符。它作为HTMLElement或JS对象的属性名。

1
expando: 
"jQuery" 
+ ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, 
"" 
),

jQuery.noData JS对象,对于指定的HTMLElement禁用data方法。如embed、applet。

jQuery.hasData 用来判断HTMLElement或JS对象是否具有数据。返回true或false。即如果调用了jQuery.data方法添加了属性,则返回true。

1
2
3
4
5
6
7
<div>aa</div>
<script>
    
var 
div = document.getElementsByTagName(
'div'
)[0];
    
$.hasData(div); 
// false
    
$.data(div, 
'name'
,
'jack'
);
    
$.hasData(div); 
// true
</script>

 

jQuery.acceptData 用来判断该元素是否能接受数据,返回true或false。在jQuery.data中使用。

 

jQuery.data 这是提供给客户端程序员使用的方法,它同时是setter/getter。

  1. 传一个参数,返回附加在指定元素的所有数据,即thisCachejQuery.data(el); // thisCache
  2. 传二个参数,返回指定的属性值jQuery.data(el, 'name'); 
  3. 传三个参数,设置属性及属性值jQuery.data(el, 'name', 'jack');jQuery.data(el, 'uu', {});
  4. 传四个参数,第四个参数pvt仅提供给jQuery库自身使用。即jQuery._data方法中传true。因为jQuery的事件模块严重依赖于jQuery.data,为避免人为的不小心重写在这个版本中加入的

 

jQuery.removeData 删除数据。

上面是jQuery数据缓存模块的整体概述,下面详细说下jQuery.data方法。jQuery.data为两种对象提供缓存:JS对象和HTMLElement

1
2
3
4
5
6
7
8
9
10
11
12
// 为JS对象提供缓存
var 
myObj = {};
$.data(myObj, 
'name'
'jack'
);
$.data(myObj, 
'name'
); 
// jack
 
// 为HTMLElement提供缓存
<div id=
"xx"
></div>
<script>
    
var 
el = document.getElementById(
'xx'
);
    
$.data(el, 
'name'
'jack'
);
    
$.data(el, 
'name'
); 
// jack
</script>

 

内部实现上也是有区别的,

1,为JS对象提供缓存时,直接将数据保存在JS对象上。cache为JS对象。此时会偷偷的给JS对象添加个属性(类似于jQuery16101803968874529044),属性值也是个JS对象。举例说明

1
2
3
var 
myObj = {};
$.data(myObj, 
'name'
'jack'
);
console.log(myObj);

 

myObj的结构如下

1
2
3
4
5
myObj = {
    
jQuery16101803968874529044 : {
        
name : 
'jack'
    
}
}

 

“jQuery16101803968874529044”这个字符串在data内部命名为id(注意并非HTMLElement元素的id),它实际就是jQuery.expando。上面已经提到它是在jQuery.js引入到页面后随机生成的。

 

2,为HTMLElement提供缓存时,却不会直接保存在HTMLElement上。而是保存在jQuery.cache上。cache为jQuery.cache。此时先给HTMLElement添加属性(类似于jQuery16101803968874529044),属性值为数字(1,2,3递增)。即只将一些数字保存在了HTMLElement上,不会直接将数据置入。这是因为IE老版本中可能会存在危险。而HTMLElement如何与jQuery.cache建立联系呢? 还是id。刚刚提到属性值数字就是id。举例说明

1
2
3
4
5
6
7
<div id=
"xx"
></div>
<script>
    
var 
el = document.getElementById(
'xx'
);
    
$.data(el, 
'name'
'jack'
);
    
console.log(el[jQuery.expando]); 
// 1
    
console.log(jQuery.cache); 
// {1 : {name:'jack'}}
</script>

  

el 上添加了属性jQuery.expando,值为id,这个id是从1开始递增的。而id又作为jQuery.cache的属性(key)。这样就HTMLElement就与jQuery.cache建立了联系。如图

不知注意到没有,jQuery.data还有第四个参数pvt,这个参数只在jQuery._data中使用。

1
2
3
4
// For internal use only.
_data: 
function
( elem, name, data ) {
    
return 
jQuery.data( elem, name, data, 
true 
);
},

  

jQuery._data从命名上就指定它是私有的,使用jQuery的客户端程序员不应该去调用该方法。jQuery的API文档上也不会公开它。

jQuery的数据缓存模块从1.2.3到1.6.1几乎每个版本都在变。jQuery._data的提出就是为了避免客户端程序员覆盖/重写了默写模块。如jQuery事件模块中事件handler等就使用jQuery.data存储,如果重写了该模块。那么事件模块将瘫痪。因此特意添加了pvt参数及jQuery._data方法。

但如果你刻意要破坏,那么还是可以做的。如下

1
2
3
4
5
6
7
8
9
10
<div id=
"xx"
>Test</div>
<script>
    
$(
'#xx'
).click(
function
(){
        
alert(
'click'
);
    
});
    
// 语句1
    
$.data($(
'#xx'
)[0], 
'events'
''
true
);
    
// 语句2
    
//$._data($('#xx')[0], 'events', '');
</script>

  

点击div[id=xx]将不会触发点击事件。

 

整个jQuery.data设置(set)数据缓存的过程就是如此,理解的这个。取数据(get)的过程就好理解了。不重复。

最后,我会给zChian.js添加zChain.data/removeData方法,因为是“迷你版”,仅给HTMLElement添加数据缓存。请注意。

 

相关:

转载于:https://www.cnblogs.com/xiaohong/p/4460292.html

你可能感兴趣的文章
一系列网络流题目-2016.10.17
查看>>
第一次作业
查看>>
Codeforces Round #216 (Div. 2) E. Valera and Queries 树状数组 离线处理
查看>>
webpack初识一
查看>>
day 32 css后续补充以及js 简单入门
查看>>
android ViewSwitcher实现程序列表分屏和动画效果(仿Launcher)
查看>>
各版本android源码下载
查看>>
Android ADT安装
查看>>
nodejs初体验
查看>>
C# 将DataTable表中的数据批量插入到数据库表中的方法
查看>>
前博客 http://bbs.landingbj.com/mytopic.jsp?action=mytopic&username=57071
查看>>
edgeR使用学习【转载】
查看>>
2018徐州网络赛H. Ryuji doesn't want to study
查看>>
nodejs REPL清屏
查看>>
Io流笔记
查看>>
仿照tomcat服务器
查看>>
(转载)php中$_SERVER[PHP_SELF] 和 $_SERVER[SCRIPT_NAME]之间的区别
查看>>
[转]YII2 常用数据库操作
查看>>
Python基础检测:20171105
查看>>
...
查看>>