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 作者:李 ...
随机推荐
- 由“如何取得CPU的温度与型号”学到的知识延伸WQL
[Base]:WMI是一项核心的 Windows 管理技术:用户可以使用 WMI 管理本地和远程计算机.WQL就是 WMI 中的查询语言,翻译成中文好像可以成为 Windows 管理规范查询语言. 1 ...
- NPOIHelp 按固定模板导出和直接导出
完整代码如下 using System; using System.Collections.Generic; using System.Data; using System.Text; using N ...
- MVC4小细节
一: @model 指令 或者也叫 @model关键字 注释:@model指令以提供一个更干净简洁的方式来指明你想要在视图文件中引用强类型模型类 作用:让视图文件(cshtml)更易读易写;VS ...
- html 禁用点击事件
1.css禁用鼠标点击事件 .disabled { pointer-events: none; } 注:(这个没有试过) jquery禁用a标签方法1 $(document).ready(functi ...
- MAC 查看端口占用
命令 lsof -i tcp:[port] (port替换成端口号,比如6379)可以查看该端口被什么程序占用,并显示PID,方便KILL 之后,kill -9 [PID] , kill进程即可 ...
- unity3d Start执行不同时问题
1.一个Scene的场景里有许多的GameObject,很多GameObject上绑定了Script,每个Script上又都有Start函数 using UnityEngine; using Syst ...
- ASP.NET js控制treeview中的checkbox实现单选功能
ASP.NET js控制treeview中的checkbox实现单选功能 function OnTreeNodeChecked() { var element = window.event.srcEl ...
- 在阿里云创建子域名,配置nginx,使用pm2部署node项目到ubuntu服务器
配置域名 在阿里云找到主域名 进入主域名之后,右上角添加解析,添加子域名, 记录类型选择cname,主机记录填写子域名的名称,记录值为主域名,至此阿里云已经配置好了. 检查nginx安装 首先检查服务 ...
- Reg命令使用详解 批处理操作注册表必备
首先要说明:编辑注册表不当可能会严重损坏您的系统.在更改注册表之前,应备份计算机上任何有价值的数据 只有在别无选择的情况下,才直接编辑注册表.注册表编辑器会忽略标准的安全措施,从而使得这些设置会降低性 ...
- [原] unity3d调用android版 人人sdk
开发过程 遇到天坑:纯android工程没问题,集成到unity3d中 就老提示 没登陆 .最后跟到底 发现是Util.java 中 openUrl 函数出的bug.unity3d 中调android ...