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缓存机制(二)的更多相关文章

  1. Solr4.8.0源码分析(19)之缓存机制(二)

    Solr4.8.0源码分析(19)之缓存机制(二) 前文<Solr4.8.0源码分析(18)之缓存机制(一)>介绍了Solr缓存的生命周期,重点介绍了Solr缓存的warn过程.本节将更深 ...

  2. jQuery缓存机制(一)

    1.首先看一下涉及到jQuery缓存机制的代码结构: // 定义一些jQuery内部的变量,方便后续使用 var data_user, data_priv, // 后续会被赋值为两个Data对象 rb ...

  3. Hibernate 缓存机制二(转)

    感谢:http://www.cnblogs.com/wean/archive/2012/05/16/2502724.html 一.why(为什么要用Hibernate缓存?) Hibernate是一个 ...

  4. jQuery缓存机制(三)

    缓存机制提供的入口有: $.data([key],[value]) // 存取数据 $.hasData(elem) // 是否有数据 $.removeData([key]) // 删除数据 $.acc ...

  5. 全面剖析Smarty缓存机制二[清除缓存方法]

    前段时间,写了一篇 Smaryt缓存机制的几种缓存方式 ,详细介绍了三种缓存方式:全局缓存.部分缓存.局部缓存,以及通过is_cache()判断是否存在缓存来进行缓存生成.本来这篇早该完成,由于时间关 ...

  6. (五)JS学习笔记 - JQuery缓存机制

    历史背景 开发中常常因为方便,把状态标志都写到dom节点中,也就是HTMLElement,缺点: 循环引用 直接暴露数据,安全性? 增加一堆的自定义属性标签,对浏览器来说是没意义的 取数据的时候要对H ...

  7. jQuery缓存机制(四)

    Data封装的方法的后面四个方法 和 dataAttr方法阅读. Data.prototype = { key: function( owner ) {}, set: function( owner, ...

  8. jquery源码解析:jQuery数据缓存机制详解1

    jQuery中有三种添加数据的方法,$().attr(),$().prop(),$().data().但是前面两种是用来在元素上添加属性值的,只适合少量的数据,比如:title,class,name等 ...

  9. Java缓存学习之二:浏览器缓存机制

    浏览器端的九种缓存机制介绍 浏览器缓存是浏览器端保存数据用于快速读取或避免重复资源请求的优化机制,有效的缓存使用可以避免重复的网络请求和浏览器快速地读取本地数据,整体上加速网页展示给用户.浏览器端缓存 ...

随机推荐

  1. Eclipse和MyEclipse的区别 分类: 编程工具 2015-07-18 11:12 23人阅读 评论(0) 收藏

    今天,在一个Q群里有人问Eclipse和MyEclipse的区别.虽然对于知道的人来说答案很简单,但是对于不知道的人来说就很难,很多问题也都是这样的,会者不难,难者不会. 其实,网上搜搜答案就挺多的, ...

  2. .NET Best Practices

    Before starting with best practices tobe followed, it is good to have clear understanding of how mem ...

  3. 机器学习——利用SVD简化数据

    奇异值分解(Singular Value Decompositon,SVD),可以实现用小得多的数据集来表示原始数据集. 优点:简化数据,取出噪声,提高算法的结果 缺点:数据的转换可能难以理解 适用数 ...

  4. vue实现点击关注之后及时更新列表

    如图,我要实现点击关注之后列表及时更新成最新的列表. 思路很简单,主要是两点: 1.在点击关注之后去执行一个请求新的关注列表的action: 2.在vue组件中watch监听已关注列表和推荐关注列表 ...

  5. proto序列化

    proto序列化和反序列化类 序列化是将我们的Protobuf类对象转换成字节数组的方法,网络底层我们从服务器获取到的是字节数组,反序列化是将字节转成proto类对象的方法 public class ...

  6. redis 的hash数据类型

    hash的常用命令 1.hset hset key field value 将哈希表key中的域field的值设为value 如果key不存在,一个新的哈希表被创建并进行HSET操作 如果field是 ...

  7. Yslow-23条军规

    YslowYahoo发布的一款基于FireFox的插件,主要是为了提高网页性能而设计的,下面是它提倡了23条规则,还是很不错的,分享一下: 1.减少HTTP请求次数 合并图片.CSS.JS,改进首次访 ...

  8. thinkphp路由

    一.普通模式 'url_route_on' => false, 二.混合模式 'url_route_on' => true, 'url_route_must'=> false, 三. ...

  9. 安装程序配置服务器失败。参考服务器错误日志和C:\windows\sqlstp.log 了解更多信息

    重装sql经常遇到2个问题 1,以前的某个程序安装已在安装计算机上创建挂起的文件操作.运行安装程序之前必须重新启动计算机. 删除C:\Program Files\Microsoft SQL Serve ...

  10. Docker background

    什么是 Docker? Docker 提供了一个可以运行你的应用程序的封套(envelope),或者说容器.它原本是 dotCloud 启动的一个业余项目,并在前些时候开源了.它吸引了大量的关注和讨论 ...