jQuery缓存机制(四)
Data封装的方法的后面四个方法 和 dataAttr方法阅读。
Data.prototype = {
key: function( owner ) {},
set: function( owner, data, value ) {},
get: function( owner, key ) {},
// 该方法集中处理了几种情况。该方法看似没什么用,其实它是暴露给用户的data方法的统一处理入口。
access: function( owner, key, value ) {
var stored;
// 如果key和value没有传入,或者((key传入了并且key是String)但是value没有传入)
if ( key === undefined ||
((key && typeof key === "string") && value === undefined) ) {
//调用Data的get方法从owner上取出key的value。如果key为undefined,返回的是owner的所有数据
stored = this.get( owner, key );
//如果stored有值则返回该值,否则将key转换成驼峰式的字符串再次调用get方法取值,并返回
//也就是 如果key类似于"a-bc",会取出"a-bc" 和"aBc"的值
return stored !== undefined ?
stored : this.get( owner, jQuery.camelCase(key) );
}
//如果key和value都存在,或者key不是字符串(是对象),则调用Data的set方法,储存数据。
this.set( owner, key, value );
// 返回value或者是key,为啥。
return value !== undefined ? value : key;
},
// 删除owner存在cache中的key对应的值
remove: function( owner, key ) {
var i, name, camel,
// 拿到对应的cache索引
unlock = this.key( owner ),
// 通过索引取出存储在cache中的值
cache = this.cache[ unlock ];
// 如果没有传入key,则将此索引(键)对应的值设置为空对象(全部删除)
if ( key === undefined ) {
this.cache[ unlock ] = {};
// 如果传入了key
} else {
// 支持array或者是以空字符分割的String
if ( jQuery.isArray( key ) ) {
// 将key中的元素复制一份并转换成驼峰式,连接到原始数据的后面
name = key.concat( key.map( jQuery.camelCase ) );
} else {
// 如果不是数组,将key转换成驼峰式
camel = jQuery.camelCase( key );
// 如果key是cache中的其中一个键
if ( key in cache ) {
// 将key和脱分化之后的key组成一个数组赋值给name
name = [ key, camel ];
} else {
// 否则直接将驼峰化之后的key赋值个name
name = camel;
// 看看驼峰化之后的key是不是cache的键(统一格式)
name = name in cache ?
[ name ] : ( name.match( core_rnotwhite ) || [] );
}
}
// 删除key或者驼峰化之后的key
i = name.length;
while ( i-- ) {
delete cache[ name[ i ] ];
}
}
},
//检查owner(DOM)上是否有数据
hasData: function( owner ) {
return !jQuery.isEmptyObject(
this.cache[ owner[ this.expando ] ] || {}
);
},
// 删除owner上所有的数据,包括owner和cache的对应关系
discard: function( owner ) {
if ( owner[ this.expando ] ) {
delete this.cache[ owner[ this.expando ] ];
}
}
};
// 该方法是对DOM中属性为“data-xxx”的处理
function dataAttr( elem, key, data ) {
var name;
//如果从内部没有找到任何数据,则尝试读取DOM元素的attribute,找出以"data-"开头的属性
if ( data === undefined && elem.nodeType === 1 ) {
// 将驼峰化转换成'-'连接的小写字符串 (匹配大写字母,并将大写字母转换成"-小写字母"的形式)
name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
// 从DOM上读取其"data-"开头的属性的值
data = elem.getAttribute( name );
// 如果data是String类型,则根据其String中的内容对其进行不同的处理
if ( typeof data === "string" ) {
//使用try catch的原因是?
try {
// 如果字符串是"true",则将字符串转换成boolean类型的true。false、null同true。
data = data === "true" ? true :
data === "false" ? false :
data === "null" ? null :
// 将其转换成数字再转换成字符串之后如果没有变化,则将其转换成数字?
+data + "" === data ? +data :
// 如果其中有{}或者[],则解析这个字符串成为json格式
rbrace.test( data ) ? JSON.parse( data ) :
data;
} catch( e ) {}
// 将在DOM属性上读取的数据存储到Data的cache中
data_user.set( elem, key, data );
} else {
data = undefined;
}
}
return data;
}
jQuery缓存机制(四)的更多相关文章
- jQuery缓存机制(一)
1.首先看一下涉及到jQuery缓存机制的代码结构: // 定义一些jQuery内部的变量,方便后续使用 var data_user, data_priv, // 后续会被赋值为两个Data对象 rb ...
- jQuery缓存机制(三)
缓存机制提供的入口有: $.data([key],[value]) // 存取数据 $.hasData(elem) // 是否有数据 $.removeData([key]) // 删除数据 $.acc ...
- (五)JS学习笔记 - JQuery缓存机制
历史背景 开发中常常因为方便,把状态标志都写到dom节点中,也就是HTMLElement,缺点: 循环引用 直接暴露数据,安全性? 增加一堆的自定义属性标签,对浏览器来说是没意义的 取数据的时候要对H ...
- jQuery缓存机制(二)
1.从用户调用的入口开始阅读,因为这是我们比较熟悉的部分(主要做参数的调整,根据不同的完成不同的功能) // 进入jQuery Data模块的入口 使用方法有三种,不传参,传一个参,传两个参.示例$( ...
- jquery源码解析:jQuery数据缓存机制详解1
jQuery中有三种添加数据的方法,$().attr(),$().prop(),$().data().但是前面两种是用来在元素上添加属性值的,只适合少量的数据,比如:title,class,name等 ...
- jquery源码解析:jQuery数据缓存机制详解2
上一课主要讲了jQuery中的缓存机制Data构造方法的源码解析,这一课主要讲jQuery是如何利用Data对象实现有关缓存机制的静态方法和实例方法的.我们接下来,来看这几个静态方法和实例方法的源码解 ...
- JS高级. 06 缓存、分析解决递归斐波那契数列、jQuery缓存、沙箱、函数的四种调用方式、call和apply修改函数调用方法
缓存 cache 作用就是将一些常用的数据存储起来 提升性能 cdn //-----------------分析解决递归斐波那契数列<script> //定义一个缓存数组,存储已经计算出来 ...
- mybatis(四)缓存机制
转载:https://www.cnblogs.com/wuzhenzhao/p/11103043.html 缓存是一般的ORM 框架都会提供的功能,目的就是提升查询的效率和减少数据库的压力.跟Hibe ...
- Java缓存学习之二:浏览器缓存机制
浏览器端的九种缓存机制介绍 浏览器缓存是浏览器端保存数据用于快速读取或避免重复资源请求的优化机制,有效的缓存使用可以避免重复的网络请求和浏览器快速地读取本地数据,整体上加速网页展示给用户.浏览器端缓存 ...
随机推荐
- Linux下seq的使用
seq - print a sequence of numbers [root@gechong ~]# man seq 主要有一下三个参数 -f:用来格式化输出 -s:用来指定分隔符号,默认是回车 - ...
- 刚看完了一本关于javascript的书感觉受益匪浅,原来不懂的东西这么多,想问问怎么成为大神?求教!!!!!!
刚看完了一本关于javascript的书感觉受益匪浅,原来不懂的东西这么多,想问问怎么成为大神?求教!!!!!!
- shell 下执行mysql 命令
From: http://blog.csdn.net/beginning1126/article/details/8590014 方案1 mysql -uuser -ppasswd -e 优点:语句简 ...
- LoadRunner做性能测试 从设计到分析执行
项目简介:像百度知道系统类似的系统性能测试,是公司的自己产品. 对最近这个系统的性能测试进行总结下: 系统功能介绍: 前台用户可以根据自己的需要对不同的区域提问,提问包括匿名和登陆用户提问 后台不同区 ...
- SOCKET,TCP/IP,UDP,HTTP,FTP总结
一.TCP/UDP,SOCKET,HTTP,FTP简析 TCP/IP是个协议组(主要解决数据如何在网络中传输),可分为三个层次:网络层.传输层和应用层: 网络层:IP协议.ICMP协议.ARP协议 ...
- Oauth2.0(二):开放平台
上一节说到Oauth2.0 的交互模型.模型涉及到三方:资源拥有者.客户端.服务提供方.其中,服务提供方包含两个角色:鉴权服务器和资源服务器.鉴权服务器负责对用户进行认证,并授权给客户端权限.认证这一 ...
- PHP导出excel文件的几种方式
PHP导出excel文件的几种方式 先说说动态生成的内容当作文件来下载的方法: 1.通过把Content-Type设置为application/octet-stream,可以把动态生成的内容当作文件来 ...
- 5 -- Hibernate的基本用法 --4 8 外连接抓取属性
外连接抓取能限制执行SQL语句的次数来提高效率,这种外连接抓取通过在单个select语句中使用outer join来一次抓取多个数据表的数据. 外连接抓取允许在单个select语句中,通过@ManyT ...
- 【权限维持】window几种隐藏技术
“真正”隐藏文件 使用Attrib +s +a +h +r命令就是把原本的文件夹增加了系统文件属性.存档文件属性.只读文件属性和隐藏文件属性. attrib +s +a +h +r c:\test 这 ...
- iOS开发-UIImageView响应点击事件
UIImageView是不能够响应点击事件的,在开发过程中我们需要经常对头像等添加点击事件,上网搜索一番后发现有如下两个方法: 1.找到点击图片Event,添加事件处理函数 UIImageView.u ...