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缓存学习之二:浏览器缓存机制
浏览器端的九种缓存机制介绍 浏览器缓存是浏览器端保存数据用于快速读取或避免重复资源请求的优化机制,有效的缓存使用可以避免重复的网络请求和浏览器快速地读取本地数据,整体上加速网页展示给用户.浏览器端缓存 ...
随机推荐
- Ironic 安装和配置详解
转自:http://amar266.blogspot.com/2014/12/ironic-installation-and-configuration.html 1.Install Openstac ...
- RMAN命令总结
一,RMANR 连接到库 1),连接本地数据库 a,如果本地有多少实例,则需要设置环境变量ORACLE_SID, windows 平台: set ORACLE_SID= INSTANACE NAME ...
- VueJs中 Class 与 Style 绑定
绑定 HTML Class 尽管可以用 Mustache 标签绑定 class,比如 class="{{ className }}",但是我们不推荐这种写法和 v-bind:cla ...
- 【FastJSON】使用JSON.toJSONString()-解决FastJson中“$ref 循环引用”的问题
fastjson 是一个 不错的json格式化工具, 但是在使用时,如果 碰到统一地址对象引用,就会用$ref替代 . 怎么去掉ref呢, 解决方法如下: String mapStr = JSONOb ...
- java 对象数组
java 对象数组 from zhaocundang@163.com 先 用类声明数组: 再把类的实例赋给数组: package works; import java.util.Scanner; pu ...
- UNIX环境编程学习笔记(13)——文件I/O之标准I/O流
lienhua342014-09-29 1 标准 I/O 流 之前学习的都是不带缓冲的 I/O 操作函数,直接针对文件描述符的,每调用一次函数可能都会触发一次系统调用,单次调用可能比较快捷.但是,对于 ...
- 大内核锁 BKL
参考:http://blog.csdn.net/universus/article/details/5623971 ...
- 《HTTP权威指南》学习笔记——HTTP概述
1.HTTP--因特网的多媒体信使 HTTP使用的是可靠的数据传输协议,能确保数据在传输过程中不会损坏或混乱. 2.Web客户端和服务器 Web服务器(HTTP服务器)根据客户端的请求返回服务端的数据 ...
- python2和3的区别,怎么样做到轻松切换2和3
以下是菜鸟教程列举的.这些零散的改变需要注意. 下面这些东西可能平时的程序根本没用到,或者稍加注意就可以了.但2和3最主要的区别是,掌握编码. 编码在所有程序中无处不在,处理不好,要么乱码,要么编码解 ...
- Eclipse------启动Server时出现弹窗Server at localhost was unable to start within 45 seconds.
弹窗详细信息: Server Tomcat v8. Server at localhost was unable to start within seconds. If the server requ ...