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. html固定宽度下拉框内容显示不全问题解决方法

    不少时候在页面中为了布局的需要,下拉列表<select>的宽度需要设成比较小的值,这时如果恰巧它包含的选择项<option>的内容比较长,那么超出select宽度的部分将会被截 ...

  2. Vue页面跳转$router.push 的用法

    vue2.0在使用的过程中, .vue文件之间的跳转,在template中的常见写法是: <router-link to="/miniCard/statement/horizon&qu ...

  3. #AOS应用基础平台# 实现了在用户权限范围内自己定义的快捷菜单的导航展示

    from=501" style="color:rgb(255,131,115); padding:0px; margin:0px; font-family:微软雅黑,Verdana ...

  4. js requestAnimationFrame

    requestAnimationFrame,Web中写动画的另一种选择  原文:https://www.cnblogs.com/Wayou/p/requestAnimationFrame.html H ...

  5. IP冲突解决方案

    客人在我所供职的酒店上网的时候,经常会弹出一个对话框,显示一些提示,如上网的注意事项和消费标准等信息;并且有自己的电影和歌曲服务器,DHCP-server也是其中的一台服务器,宾馆.酒店就是用这台机器 ...

  6. 超强OCR文字识别软件首选ABBYY FineReader

    提到纸质文档—转换—文本格式—可编辑这些字眼,相信大家的第一反映都是OCR文字识别软件,如何排除错误或利用辅助信息提高识别正确率,是OCR最重要的课题,衡量一个OCR系统性能好坏的主要指标无非是精确度 ...

  7. jsp+springmvc实现文件上传、图片上传和及时预览图片

    1.多文件上传:http://blog.csdn.net/a1314517love/article/details/24183273 2.单文件上传的简单示例:http://blog.csdn.net ...

  8. mysql 直接拷贝data 目录下文件用不的解决方案

    innodb 的表,直接复制文件是无法使用的,会提示 table doesn’t exists ,在复制的时候,应将data目录下的 ibdata1 文件一并复制过去,并且删除 ib_logfile0 ...

  9. 【scala】 scala xml 处理(⑨)

    1.scala 处理xml 2. 获取属性 3.修改节点 4.遍历 5.模式匹配 6.命名空间 7.文件加载 import scala.xml._ /** * @author xwolf * @sin ...

  10. Hibernate的Configuration和SessionFactiory

    Configuration: Configuration是hibernate的入口,负责管理Hibernate的配置信息,这些配置信息都是从配置文件hibernate.cfg.xml或者Hiberna ...