挂载到$上的几个属性操作方法分析,发现属性操作用到了sizzle封装的方法

attr: function( elem, name, value ) {
        var hooks, ret,
            nType = elem.nodeType;
        // 如果elem不存在,或者是文本节点、注释或者是属性节点,直接返回。
        if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
            return;
        }
        // 当不支持getAtrribute方法时(估计是处理浏览器兼容问题)
        if ( typeof elem.getAttribute === core_strundefined ) {

       // 交给prop处理
            return jQuery.prop( elem, name, value );
        }

// All attributes are lowercase
        // Grab necessary hook if one is defined

    // 当elem类型不是元素时或者elem不是XML文档时
        if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
           // 将属性名转换成小写字母

    name = name.toLowerCase();

     // 根据属性名得到对应的hooks,竟然依赖Sizzle,汗。。。
            hooks = jQuery.attrHooks[ name ] ||
                ( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );
        }
    // 如果有第三个参数(value)
        if ( value !== undefined ) {
    // 如果第三个参数是null
            if ( value === null ) {

      // 清空elem上属性为name的属性
                jQuery.removeAttr( elem, name );
    // 如果hooks存在,并且hooks存在set方法,执行hooks的set方法将结果赋值给ret,如果ret不是undefined,返回ret
            } else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
                return ret;
    // 如果是支持setAttribute的浏览器,直接调用setAttribute方法,并将value转换成字符串
            } else {
                elem.setAttribute( name, value + "" );
                return value;
            }
   // 如果没有value,并且hooks存在,并且hooks有get方法,调用get方法获取到元素上的name属性并返回属性值
        } else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
            return ret;
    // 此处处理没有value,但不需要hooks处理的情况。
        } else {

     // jQuery.find == Sizzle。调用sizzle封装的方法获取元素属性值
            ret = jQuery.find.attr( elem, name );
            // 返回ret
            return ret == null ?
                undefined :
                ret;
        }
    },
  // 删除属性
    removeAttr: function( elem, value ) {
        var name, propName,
            i = 0,

    // value可以是一个空格间隔的字符串,通过正则处理,将value按空格分隔形成数组,赋值给attrNames。
            attrNames = value && value.match( core_rnotwhite );
    // 如果attrNames数组不为空,并且elem属于元素节点
        if ( attrNames && elem.nodeType === 1 ) {

    // 遍历attrNames数组
            while ( (name = attrNames[i++]) ) {

      // 如果该属性存在于propFix对象中,则将对象中对应的值赋值给propName,否则直接将name赋值给propName(propFix中做了一些替换)
                propName = jQuery.propFix[ name ] || name;
      // 如果是布尔属性(猜测可能是处理例如checked这样的属性的)
                if ( jQuery.expr.match.bool.test( name ) ) {
                    // 将其值设置为false
                    elem[ propName ] = false;
                }
      // 调用elem的removeAttribute方法,删除那么属性
                elem.removeAttribute( name );
            }
        }
    },

最新文章

  1. photoshop常见抠图方法
  2. CSS position绝对定位absolute relative
  3. Java面试总结系列之Collections.sort()
  4. C语言操作文件
  5. [转]GCC参数详解
  6. ARM处理器全解析:A8/A9/A15都是什么?
  7. Notepad++中调用cl.exe编译器(Windows)
  8. Android WebView和JavaScript交互
  9. LaTeX 多个图片共用一个题注的实现--子图形
  10. python微信聊天机器人改进版,定时或触发抓取天气预报、励志语录等,向好友推送
  11. vs2015安装编辑神器:resharper10.0
  12. Notes on Noise Contrastive Estimation and Negative Sampling
  13. mysql常用语句练习-基于ecshop2.7.3数据库(1)
  14. 【Javascript Demo】根据Email地址跳转到相应的邮箱登录页面
  15. 小议linux
  16. [HNOI2014]江南乐 博弈论
  17. POJ.3894 迷宫问题 (BFS+记录路径)
  18. 你的APK安全吗?来WeTest免费测!
  19. Android图片下载以及缓存框架
  20. Exchange Version and UpdateRollups

热门文章

  1. Java多线程——可阻塞的队列BlockingQueue
  2. CentOS7 防火墙配置(关闭)
  3. 正則表達式re中的贪心算法和非贪心算法 在python中的应用
  4. MongoDB之update
  5. Unity3D学习笔记——Android远程真机调试(Unity Remote)
  6. MySQL 字符串拼接详解
  7. 本地存储(LocalStorage、SessionStorage、Web SQL Database、Indexed DB)
  8. [转]spring 官方下载地址(Spring Framework 3.2.x&Spring Framework 4.0.x)
  9. ios开发之--跳转到指定的TabBarViewController中的某一个VIewController
  10. centos上yum安装异常处理