`
nanjingjiangbiao_T
  • 浏览: 2593475 次
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

jQuery缓存操作-cache数据

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

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对象的属性名。

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。

<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

// 为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对象。举例说明

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

myObj的结构如下
myObj = {
jQuery16101803968874553435 : {
name : 'jack'
}
}


jQuery16101803968874553435 这个字符串在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。举例说明
<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中使用。
// 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方法。


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

<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]将不会触发点击事件。
分享到:
评论

相关推荐

    Ajax-jquery-ajax-cache.zip

    Ajax-jquery-ajax-cache.zip,jquery插件,用于用“localstorage”或“sessionstorage”缓存ajax。,ajax代表异步javascript和xml。它是多种web技术的集合,包括html、css、json、xml和javascript。它用于创建动态网页...

    [原创] jQuery源码分析-07数据缓存-Cache

    NULL 博文链接:https://nuysoft.iteye.com/blog/1195313

    jquery.selector-cache:通过缓存选择器来加速jQuery代码

    jquery.selector-cache 通过缓存选择器来加速jQuery代码安装使用凉亭: bower install jquery.selector-cache用法在jQuery之后添加jquery.selector-cache.js即可。浏览器支持该优化将在起作用。 在任何其他浏览器中...

    jQuery的缓存「jQuery-cache」-crx插件

    用本地文件替换jQuery,以加速页面加载。 Replace jQuery file in the page ...欢迎到 https://github.com/yangsibai/jQuery-cache 使用 pull request 补充其他常见文件的本地缓存。 支持语言:English (United States)

    AJAXCache是一款jQuery缓存插件可以为ajax方法扩展缓存功能

    AJAX-Cache是一款jQuery缓存插件,可以为$.ajax()方法扩展缓存功能

    jquery-ajax-session-storage-cache:使用 ttl 在 html5 sessionStorage 对象中缓存 jQuery ajax 响应

    jQuery的阿贾克斯会话存储高速缓存 一个简单、轻量级的 jQuery 插件,用于使用 ttl 在 html5 sessionStorage 对象(如果可用)中缓存 ajax 响应。 用于减少服务器上可能会陈旧一段时间的数据的负载。 在第一个请求...

    解析jquery中的ajax缓存问题

    jquery的ajax请求默认请求cache是true 也就是开启的,dataType为script和jsonp时默认为false。现在我要在浏览器里读取缓存,因为ajax请求的数据很大,请求一次就够了。但是问题来了,在FF里面,是没有ajax缓存的,也...

    Ajax-AJAX-Cache.zip

    Ajax-AJAX-Cache.zip,最好的jquery ajax缓存插件,ajax代表异步javascript和xml。它是多种web技术的集合,包括html、css、json、xml和javascript。它用于创建动态网页,其中网页的小部分在不重新加载网页的情况下更改...

    jQuery:图片缓存 10 jQuery Image Cache Plugins and Scripts

    NULL 博文链接:https://justcoding.iteye.com/blog/2188138

    formcache:一个简单的jQuery表单缓存插件

    一个简单的 jQuery 表单缓存插件。入门快速开始提供三个快速启动选项: 。 克隆存储库: git clone https://github.com/fengyuanchen/formcache.git 。 使用 npm install formcache : npm install formcache 。安装...

    api-cache:JavaScript对API数据的缓存组件

    JavaScript对API数据的缓存组件,可以利用localStorage来存储不常更新但经常访问的接口数据,通过设置缓存时间来控制实际发起请求的最小时间间隔。 浏览器兼容性 需要支持localStorage和JSON,请参考、 依赖 目前...

    jquery电子文档chm

    cache (Boolean) : (默认: true) jQuery 1.2 新功能,设置为 false 将不会从浏览器缓存中加载请求信息。 complete (Function) : 请求完成后回调函数 (请求成功或失败时均调用)。参数: XMLHttpRequest 对象,成功...

    关于jQuery对象数据缓存Cache原理以及jQuery.data详解

    网上有很多教你怎么使用jQuery.data(..)来实现数据缓存,但有两个用户经常使用的data([key],[value])和jQuery.data(element,[key],[value])几乎没有什么文章说清楚它们两的区别,所以我用到了,研究下分享给大家。...

    jQuery对象数据缓存Cache原理及jQuery.data方法区别介绍

    jQuery.data(..)来实现数据缓存,但有两个用户经常使用的data([key],[value])和jQuery.data(element,[key],[value]),接下来为大家介绍下他们的区别,感兴趣的朋友可以参考下哈

    jQuery中数据缓存$.data的用法及源码完全解析

    在读取、设置、移除数据时,将通过关联id从全局缓存对象jQuery.cache中找到关联的数据缓存对象,然后在数据缓存对象上执行读取、设置、移除操作。 对于Javascript对象,数据则直接存储在该Javascript对象的属性...

    jQuery ajax cache缓存问题

    在jquery里面用$.ajax 然后, 指定ajax属性的时候, 使用了:’false’ . 可恶的javascript特性就在这里出现了。 在jquery里面, 大部分的时候, 属性要用”引起来。 否则容易变成变量名。比如red, 引不引都差不多...

    jquery-1.1.3 效率提高800%

    // the options for this ajax request }cache(true) 数据类型: Boolean jQuery 1.2中新添加的参数, 如果设为false,则会强制浏览器不缓存请求的页面。 complete 数据类型: Function 当请求完成时...

Global site tag (gtag.js) - Google Analytics