jQuery缓存机制(二)
1、从用户调用的入口开始阅读,因为这是我们比较熟悉的部分(主要做参数的调整,根据不同的完成不同的功能)
// 进入jQuery Data模块的入口 使用方法有三种,不传参,传一个参,传两个参。示例$("div").data("name", "value")
// 如果不传参则返回该元素上的所有数据,传一个参数则返回该元素上对应的属性值,传两个参数则为该元素绑定该属性并赋值
data: function( key, value ) {
var attrs, name,
// 取出jQuery对象中的第一个DOM对象,数据是存储在DOM对象上而不是jQuery对象上。
elem = this[ 0 ],
i = 0,
data = null;
// key === undefined 说明一个参数都没有传入,$("div").data(),此时取出绑定在该jQuery对象中第一个DOM对象上的所有数据
if ( key === undefined ) {
// 如果该jQuery对象中至少包含一个DOM对象
if ( this.length ) {
// 调用Data对象的get方法,取得存在elem上所有的数据
data = data_user.get( elem );
// 如果elem是元素节点 并且elem上没有存"hasDataAttrs",使用内部Data对象为什么?
if ( elem.nodeType === 1 && !data_priv.get( elem, "hasDataAttrs" ) ) {
attrs = elem.attributes;
//遍历elem的所有属性
for ( ; i < attrs.length; i++ ) {
name = attrs[ i ].name;
// 如果该属性名是以"data-"开头的.
if ( name.indexOf( "data-" ) === 0 ) {
// 去掉"data-"并将其后的字符串转变成驼峰式的
name = jQuery.camelCase( name.slice(5) );
// 将DOM元素的属性上存储的数据存进Data的cache中
dataAttr( elem, name, data[ name ] );
}
}
// 存入另一个Data对象的cache中,用来告诉上一个if语句,不需要再进行读DOM上的属性了。
data_priv.set( elem, "hasDataAttrs", true );
}
}
return data;
}
// 如果key是一个对象,说明用户是在以键值对的形式传入的参数
if ( typeof key === "object" ) {
// 调用set方法,内部是吧key这个对象的键为键,值为值存入到cache中
return this.each(function() {
data_user.set( this, key );
});
}
// 一个统一的接口,根据参数做出不同的响应
return jQuery.access( this, function( value ) {
var data,
// 将key转换为驼峰式
camelKey = jQuery.camelCase( key );
// 如果调用data方法的对象中存在DOM元素并且没有传入value
if ( elem && value === undefined ) {
// 从外部使用的data对象中取出响应key的value
data = data_user.get( elem, key );
// 如果存在这个value就返回它
if ( data !== undefined ) {
return data;
}
// 如果没有取到,尝试将key转换成驼峰式再去取一次(DOM属性中的data-属性的存储方式)
data = data_user.get( elem, camelKey );
if ( data !== undefined ) {
return data;
}
// 如果仍然没取到,调用dataAttr方法取(还没看,感觉是从DOM上取),
data = dataAttr( elem, camelKey, undefined );
if ( data !== undefined ) {
return data;
}
// 尝试了很多方法都没返回,则直接返回undefined
return;
}
// 没明白它要干嘛
this.each(function() {
var data = data_user.get( this, camelKey );
data_user.set( this, camelKey, value );
if ( key.indexOf("-") !== -1 && data !== undefined ) {
data_user.set( this, key, value );
}
});
}, null, value, arguments.length > 1, null, true );
},
jQuery缓存机制(二)的更多相关文章
- Solr4.8.0源码分析(19)之缓存机制(二)
Solr4.8.0源码分析(19)之缓存机制(二) 前文<Solr4.8.0源码分析(18)之缓存机制(一)>介绍了Solr缓存的生命周期,重点介绍了Solr缓存的warn过程.本节将更深 ...
- jQuery缓存机制(一)
1.首先看一下涉及到jQuery缓存机制的代码结构: // 定义一些jQuery内部的变量,方便后续使用 var data_user, data_priv, // 后续会被赋值为两个Data对象 rb ...
- Hibernate 缓存机制二(转)
感谢:http://www.cnblogs.com/wean/archive/2012/05/16/2502724.html 一.why(为什么要用Hibernate缓存?) Hibernate是一个 ...
- jQuery缓存机制(三)
缓存机制提供的入口有: $.data([key],[value]) // 存取数据 $.hasData(elem) // 是否有数据 $.removeData([key]) // 删除数据 $.acc ...
- 全面剖析Smarty缓存机制二[清除缓存方法]
前段时间,写了一篇 Smaryt缓存机制的几种缓存方式 ,详细介绍了三种缓存方式:全局缓存.部分缓存.局部缓存,以及通过is_cache()判断是否存在缓存来进行缓存生成.本来这篇早该完成,由于时间关 ...
- (五)JS学习笔记 - JQuery缓存机制
历史背景 开发中常常因为方便,把状态标志都写到dom节点中,也就是HTMLElement,缺点: 循环引用 直接暴露数据,安全性? 增加一堆的自定义属性标签,对浏览器来说是没意义的 取数据的时候要对H ...
- jQuery缓存机制(四)
Data封装的方法的后面四个方法 和 dataAttr方法阅读. Data.prototype = { key: function( owner ) {}, set: function( owner, ...
- jquery源码解析:jQuery数据缓存机制详解1
jQuery中有三种添加数据的方法,$().attr(),$().prop(),$().data().但是前面两种是用来在元素上添加属性值的,只适合少量的数据,比如:title,class,name等 ...
- Java缓存学习之二:浏览器缓存机制
浏览器端的九种缓存机制介绍 浏览器缓存是浏览器端保存数据用于快速读取或避免重复资源请求的优化机制,有效的缓存使用可以避免重复的网络请求和浏览器快速地读取本地数据,整体上加速网页展示给用户.浏览器端缓存 ...
随机推荐
- python模块之 - subprocess执行unix/linux命令
subprocess模块提供了一种一致的方法来创建和处理附加进程,与标准库中的其它模块相比,提供了一个更高级的接口,subprocess模块用来生成子进程,并可以通过管道连接它们的输入/输出/错误,以 ...
- chrome浏览器表单自动填充默认样式(背景变黄)-autofill
之所以出现这样的样式, 是因为Chrome会自动为input增加如下样式. 这个样式的优先级也比较高. 无法通过important覆盖(这就比较恶心了). 解决方案(3种): 1. 关闭自动保存账号密 ...
- 管道符和作业控制 shell变量 环境变量配置文件
8.6 管道符和作业控制 8.7/8.8 shell变量 8.9 环境变量配置文件 管道符和作业控制 管道符:表示把一个文件的输出内容传送到后面的命令 grep 用来过滤指定关键词的命令 “|” 为 ...
- 关于golang中包(package)的二三事儿
golang的package和其他语言的组织方式完全不同,刚开始接触时,很不适应. golang的package的特点: 1.go的package不局限于一个文件,可以由多个文件组成. 组成一个pac ...
- 元素加了position:absolute则该元素的text-align:center居中失效的解决办法
position:absolute; top:50%; left:50%; -webkit-transform: translate(-50%,-50%); -moz-transform: trans ...
- Window 10 :我的性能优化:那效果,杠杠的!
微软的 windows 10,不错! 当全新安装后,性能总觉得别别扭扭,不那么干净利落. 下面就是我的个人优化措施,期间有很多技术性的操作,如果你没有动手能力,或者是技术小白,可以不用再看了! (1) ...
- perforce 学习资源
这两天,要将depot切换到stream 使用,收集了很多perforce的学习资源,在这里记录一下: perforce 官网: www.perforce.com perforce参考手册: ht ...
- char与TCHAR相互转换(拒绝中文乱码,好用!)
C++编程中屡屡要遇到宽窄字符转换的问题,尤其是字符串中有中文,稍有不慎就会中文乱码,程序运行出错. 下面为char*.char[]与TCHAR*.TCHAR[]互转的用法,不求花哨,只求好用!请参考 ...
- php扩展yaf 按照配置
Yaf,全称 Yet Another Framework,是一个C语言编写的PHP框架,是一个用PHP扩展形式提供的PHP开发框架, 相比于一般的PHP框架, 它更快. 它提供了Bootstrap, ...
- javascript的闭包计数器实现,python实现各种方法来实现计数器
菜鸟教程的javascript闭包章节中,演示了js计数器的实现. 教程地址 http://www.runoob.com/js/js-function-closures.html 代码1 var ...