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# 判断字符串为空有哪几种方法

    Length法:);Empty法:bool isEmpty = (str == String.Empty);General法:bool isEmpty = (str == ""); ...

  2. Caffe 学习:Eltwise层

    Eltwise层的操作有三个: 1. PROD(product):按元素乘积 2. SUM:按元素求和(默认操作) 3. MAX:保存元素大者

  3. linux下命令行打开文件管理器

    nautilus,这个太有用了,应为可以在secureCRT中使用,因为可以添加sudo来调用

  4. koa项目用mongoose与mongodb交互,始终报错FormModel is not defined

    koa项目用mongoose与mongodb交互,始终报错FormModel is not defined,就是自己定义的model实例始终不能找到,但是明明定义了,这时候就要看大小写了,当创建一个m ...

  5. mysql覆盖索引(屌的狠,提高速度)

    话说有这么一个表: CREATE TABLE `user_group` ( `id` int(11) NOT NULL auto_increment, `uid` int(11) NOT NULL, ...

  6. C#爬网页时“远程服务器返回错误: (403) 已禁止”解决方法

    HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(uri); //这个一定要加上,在某些网站没有会发生"远程服务器返回错误: ...

  7. [原]unity3d调用android webView

    1.配置dialog xml文件: <resources>    <style name="dialogStyleWindow" parent="@an ...

  8. MTK 精简ROM

    PhaseBeam.apk--------------------------------------动态壁纸光之韵律(可删) Phone.apk--------------------------- ...

  9. iOS6 中 Smart App Banners介绍和使用(转自COCOACHINA.COM)

    转自:http://www.cocoachina.com/applenews/devnews/2012/0924/4842.html iOS 6新增Smart App Banners,也就是“智能Ap ...

  10. Java通过复选框控件数组实现添加多个复选框控件

    编写程序,通过复选框控件数组事先选择用户爱好信息的复选框,在该程序中,要求界面中的复选框数量可以根据指定复选框名称的字符串数组的长度来自动调节. 思路如下: 创建JPanel面板对象: 使用JPane ...