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缓存学习之二:浏览器缓存机制
浏览器端的九种缓存机制介绍 浏览器缓存是浏览器端保存数据用于快速读取或避免重复资源请求的优化机制,有效的缓存使用可以避免重复的网络请求和浏览器快速地读取本地数据,整体上加速网页展示给用户.浏览器端缓存 ...
随机推荐
- 性能监控-TP理解
首先给出Google到的答案: The tp90 is a minimum time under which 90% of requests have been served. tp90 = top ...
- jquery获取表单数据方法$.serializeArray()获取不到disabled的值
$.serializeArray()获取不到disabled的值 经实验,$.serializeArray()获取不到disabled的值,如果想要让input元素变为不可用,可以把input设为re ...
- RMAN:简单的duplicate创建新数据库 for 12c+
构建参数文件 *.db_name='test2' ##### 需要注意的地方,和rman的duplicate目标库一致 *.compatible='18.0.0' ##### 关键的地方,每个版本的模 ...
- Android : Your APK does not seem to be designed for tablets.
1. 解决办法: Add these config in AndroidManifest.xml <supports-screens android:smallScreens="tru ...
- 查询SQL阻塞语句
SELECT SPID=p.spid, DBName = convert(CHAR(),d.name), ProgramName = program_name, LoginName = convert ...
- Apache+php5
.下载回来的是解压文件,解压好放到要安装的位置.(我这里以D:\Acpache24为例) .打开Apache24\conf下httpd.conf 文件,用记事本打开即可. ()第37行ServerRo ...
- [转]IOS 崩溃日志分析
以下是一个crash log示例: // 1: Process Information Incident Identifier: 30E46451-53FD--896A-457FC11AD05F Cr ...
- JQuery难点备忘
1 jquery绑定事件如何传递参数 $("#btn").bind("click",{"id":"111"," ...
- SqlServer当前月份时间
SqlServer当前月份时间 SELECT -DAY(getdate()+-DAY(getdate()))
- vue实现百度搜索下拉提示功能
这段代码用到vuejs和vue-resouece.实现对接智能提示接口,并通过上下键选择提示项,按enter进行搜索 <!DOCTYPE html> <html lang=" ...