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. C# 获取web.config配置文件

    .ConfigurationManager提供对客户端应用程序配置文件的访问. 其有两个属性1.ConnectionStrings 获取当前应用程序默认配置的 ConnectionStringsSec ...

  2. js中的坑

    for in vs hasOwnProperty == === 对象比较用===,值比较用==. 严格运算用=== http://www.zhihu.com/question/31442029 著作权 ...

  3. Hibernate与MyBatis的对比

    Hibernate与MyBatis的对比总结,希望大家指出不对之处. 第一章 Hibernate与MyBatis Hibernate 是当前最流行的O/R mapping框架,它出身于sf.net,现 ...

  4. 【WP8】线程安全的StorageHelper

    14-08-29 12:32更新:修复StorageHelper部分bug WP8以后提供了StorageFile的方式访问文件,StorageFile对文件的操作只提供了异步的支持,包括WP8.1 ...

  5. Canvas控件之CanvasGroup

    Canvas Group可以用来控制一组不需要个别控制的UI元素的某些方面,CanvasGroup的属性会影响他所有children的GameObject 其中有四个选项: -Alpha:这个选项很多 ...

  6. make screenshot at Eclipse

    In Eclipse, from the Window menu, select Open Perspective > Other... > DDMS. Select the Kindle ...

  7. sql server 2014 序列號

    亲测可用 27HMJ-GH7P9-X2TTB-WPHQC-RG79R

  8. linux环境中如何删除文件的前n行?

    需求描述: 今天看了一个系统的临时文件,有5.6G的大小,这个文件也没有用了,想要将大部分的文件都删除掉. 在此记录下删除的过程.删除前n行的记录. 操作过程: 对于数据量比较大的情况(本例5800万 ...

  9. Java计算几何图形的面积

    对于每个几何图形而言,都有一些共同的属性,如名字.面积等,而其计算面积的方法却各不相同.为了简化开发,请编写程序,定义一个超类来实现输入名字的方法,并使用抽象方法来计算面积. 思路分析: 所谓超类就是 ...

  10. ECharts 3 -- gauge表盘的配置项

    绘制一个简单的表盘图表 在绘图前我们需要为 ECharts 准备一个具备高宽的 DOM 容器. <body> <!-- 为 ECharts 准备一个具备大小(宽高)的 DOM --& ...