jQuery缓存机制(三)
缓存机制提供的入口有:
$.data([key],[value]) // 存取数据
$.hasData(elem) // 是否有数据
$.removeData([key]) // 删除数据
$.acceptData(elem) // 检测元素是否可以使用缓存机制存数据
$(elem).data([key],[value]) // 存取数据
$(elem).removeData([key]) // 删除数据
已经阅读了缓存机制为用户提供的入口,并且重点阅读了$(elem).data()方法(其它方法都是直接调用data_user对象的方法),
接下来重点看data_user对象封装的属性和方法
Data.prototype = {
  // 生成一个key使用它将cache和元素联系起来,并最终返回这个key
	  key: function( owner ) {
		    //如果owner不是元素节点或document节点,则返回0,为什么返回0?为了校验?
		    if ( !Data.accepts( owner ) ) {
			      return 0;
		    }
		    // 一个暂时的对象,将被扩展到owner对象上。
		    var descriptor = {},
			    // 判断owner对象上是否已经有这个jQuery随机产生的键。
			    // 这里的this是后面new 出来的Data对象,所以其expando是固定的值,对在该data对象内存取数据的elem都是一致的
			    unlock = owner[ this.expando ];
    // 如果没有这个键,则为owner对象创建一个。
		    if ( !unlock ) {
			      // 每次有新的对象想要调用data存储数据,都将uid增加1。保证唯一性。该uid是cache中的键
			      unlock = Data.uid++;
try {
        // 为descriptor添加属性(expando的值),将生成唯一id关联在descriptor上。
				        descriptor[ this.expando ] = { value: unlock };
// 再将descriptor关联在owner上,使owner最终和unlock关联起来,用于在cache中操作数据
        // 第二个参数应该是字符串?传一个对象进来不知道是怎么操作的,需要深入了解下definePropertyies方法
				        Object.defineProperties( owner, descriptor );
} catch ( e ) {
        // 处理元素上不能存对象的情况
				        descriptor[ this.expando ] = unlock;
				        jQuery.extend( owner, descriptor );
			      }
		    }
    // 如果cache[unlock]没有值,则将其值设置为空对象
		    if ( !this.cache[ unlock ] ) {
			      this.cache[ unlock ] = {};
		    }
		    //返回一个cache的索引
		    return unlock;
	  },
	  set: function( owner, data, value ) {
		    var prop,
			      // 存数据之前,先调用key方法,拿到元素上绑定好的唯一UID,如果没有就创建一个
			      unlock = this.key( owner ),
      // 根据这个UID到cache中拿到已经存储的数据,如果之前没有存储过,会返回一个空对象
			      cache = this.cache[ unlock ];
    // 处理三个参数都存在的情况
		    if ( typeof data === "string" ) {
      // 以data为键,以value为值将数据存储到cache中,如果之前存过就覆盖掉
			      cache[ data ] = value;
    //处理只有两个参数,并且第二个参数是个对象的情况
		    } else {
			      // 如果cache中是空的
			      if ( jQuery.isEmptyObject( cache ) ) {
        // 将data对象扩展到cache。不需要深度扩展?
				        jQuery.extend( this.cache[ unlock ], data );
			      // 如果不是空对象,需要一个一个赋值。?
			      } else {
				        for ( prop in data ) {
					          cache[ prop ] = data[ prop ];
				        }
			      }
		    }
		    return cache;
	  },
	  get: function( owner, key ) {
		    // 创建一个cache,将owner存储到Data对象的cache中的所有数据缓存起来。
		    var cache = this.cache[ this.key( owner ) ];
		    // 如果key存在则返回key对象的值,否则将owner上的所有值都返回。
		    return key === undefined ?
			    cache : cache[ key ];
	  },
	  // 剩下的四个方法下次再看。
access : function(){},
remove : function(){},
hasData : function(){},
discard : function(){} // Data虽然封装了这个方法,但并没有暴露出来,也没有在内部使用。作用是删除owner存储到cache中的所有数据
};
jQuery缓存机制(三)的更多相关文章
- jQuery缓存机制(一)
		1.首先看一下涉及到jQuery缓存机制的代码结构: // 定义一些jQuery内部的变量,方便后续使用 var data_user, data_priv, // 后续会被赋值为两个Data对象 rb ... 
- (五)JS学习笔记 - JQuery缓存机制
		历史背景 开发中常常因为方便,把状态标志都写到dom节点中,也就是HTMLElement,缺点: 循环引用 直接暴露数据,安全性? 增加一堆的自定义属性标签,对浏览器来说是没意义的 取数据的时候要对H ... 
- jQuery缓存机制(四)
		Data封装的方法的后面四个方法 和 dataAttr方法阅读. Data.prototype = { key: function( owner ) {}, set: function( owner, ... 
- jQuery缓存机制(二)
		1.从用户调用的入口开始阅读,因为这是我们比较熟悉的部分(主要做参数的调整,根据不同的完成不同的功能) // 进入jQuery Data模块的入口 使用方法有三种,不传参,传一个参,传两个参.示例$( ... 
- jquery源码解析:jQuery数据缓存机制详解1
		jQuery中有三种添加数据的方法,$().attr(),$().prop(),$().data().但是前面两种是用来在元素上添加属性值的,只适合少量的数据,比如:title,class,name等 ... 
- ContentType组件,Django缓存机制,跨域请求
		ContentType组件 解决什么问题:表的id和数据id,来唯一确定一条数据 用: 插入数据: models:content_obj = GenericForeignKey('table_id', ... 
- contenttype组件、Django缓存机制以及跨域请求
		1 昨日回顾 版本控制 *** (1)url=127.0.0.1/course/?version=v100000 1 versioning_class=QueryParameterVersioning ... 
- jquery源码解析:jQuery数据缓存机制详解2
		上一课主要讲了jQuery中的缓存机制Data构造方法的源码解析,这一课主要讲jQuery是如何利用Data对象实现有关缓存机制的静态方法和实例方法的.我们接下来,来看这几个静态方法和实例方法的源码解 ... 
- 【腾讯Bugly干货分享】彻底弄懂 Http 缓存机制 - 基于缓存策略三要素分解法
		本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/qOMO0LIdA47j3RjhbCWUEQ 作者:李 ... 
随机推荐
- XSD 数据类型
			字符串数据类型(String Data Type) 字符串数据类型可包含字符.换行.回车以及制表符. 下面是一个关于某个 scheme 中字符串声明的例子: <xs:element name=& ... 
- iOS : 用 InterfaceBuilder 开始一个项目
			1.创建一个 xib 文件 : Main_iPhone.xib 更改 File's Owner 的 Class 为 UIApplication; 添加 1 个 Window .1 个 Object . ... 
- WPF TextBox属性IsReadOnlyCaretVisible
			纠结了半天WPF下只读的TextBox怎么显示输入焦点提示,发现wpf 4中已有新属性“IsReadOnlyCaretVisible”,大善^_^ 
- VVDocumenter规范注释生成器
			下载地址:https://github.com/onevcat/VVDocumenter-Xcode PS:Xcode 8.0 默认支持了,但是是关闭状态,需要在终端输入如下命令开启,然后重启 Xco ... 
- Node.js+Express on IIS(续)
			前一篇文章介绍了如何用iis来伺服node网站(开发期间特别有用),结果还落掉一点,我们用node来做restful服务的时候,很多时候可能要响应500系列的状态码,并不是整个系统从头到尾都是200, ... 
- SSM框架面试题及答案整理
			一.Spring面试题 1.Spring 在ssm中起什么作用? Spring:轻量级框架 作用:Bean工厂,用来管理Bean的生命周期和框架集成. 两大核心:①. IOC/DI(控制反转/依赖注入 ... 
- SpringMVC------报错:java.lang.ClassNotFoundException: org.springframework.web.filter.CharacterEncodingFilter
			详细信息: java.lang.ClassNotFoundException: org.springframework.web.filter.CharacterEncodingFilter 严重: E ... 
- Activiti 5.1.4最佳实践
			1.简单介绍 Activiti是一个开源的工作流引擎,它实现了BPMN 2.0规范,可以发布设计好的流程定义,并通过api进行流程调度. Activiti 作为一个遵从 Apache 许可的工作流和业 ... 
- backbone学习笔记:模型(Model)(2)属性验证
			Backbone的属性验证有2种方法: 1.Backbone自带简单的验证方法,但是验证规则需要自己实现 通过validate()方法进行验证,验证规则写在此方法里. var RoomModel = ... 
- 使用HTML5监测网站性能
			在这个信息爆炸的互联网时代,越来越多的人缺少了等待的耐心,网站性能对于一个网站来说越来越重要.以下为监控到的网站打开时间对跳出率的影响: 当网站打开时间在0-1秒时,跳出率为12% 当网站打开时间在1 ... 
