挂载到$上的几个属性操作方法分析,发现属性操作用到了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 );
            }
        }
    },

jQuery属性操作(二)的更多相关文章

  1. jquery——属性操作、特殊效果

    1. attr().prop() 取出或者设置某个属性的值 <!DOCTYPE html> <html lang="en"> <head> &l ...

  2. Jquery属性操作(入门二)

    ********JQuery属性相关的操作******** 1.属性 属性(如果你的选择器选出了多个对象,那么默认只会返回出第一个属性). attr(属性名|属性值) - 一个参数是获取属性的值,两个 ...

  3. jQuery源代码学习之八——jQuery属性操作模块

    一.jQuery属性模块整体介绍 jQuery的属性操作模块分四个部分:html属性操作,dom属性操作,类样式操作,和值操作. html属性操作(setAttribute/getAttribute) ...

  4. python全栈开发day48-jqurey自定义动画,jQuery属性操作,jQuery的文档操作,jQuery中的ajax

    一.昨日内容回顾 1.jQuery初识 1).使用jQuery而非JS的六大理由 2).jQuery对象和js对象转换 3).jQuery的两大特点 4).jQuery的入口函数三大写法 5).jQu ...

  5. web前端----jQuery属性操作

    知识点总结 1.属性 属性(如果你的选择器选出了多个对象,那么默认只会返回出第一个属性). attr(属性名|属性值) - 一个参数是获取属性的值,两个参数是设置属性值 - 点击加载图片示例 remo ...

  6. 前端之JQuery:JQuery属性操作

    Jquery2--属性相关的操作 知识点总结 1.属性 属性(如果你的选择器选出了多个对象,那么默认只会返回出第一个属性). attr(属性名|属性值) - 一个参数是获取属性的值,两个参数是设置属性 ...

  7. jQuery属性操作

    jQuery 的属性操作的核心部分其实就是对底层 getAttribute().setAttributes()等方法的一系列兼容性处理 ...if ( notxml ) { name = name.t ...

  8. jQuery 属性操作和CSS 操作

    如有在jQuery方法中涉及到函数,此函数必定会返回一个数值(函数由于运行次数不同触发一些不同效果) jQuery 属性操作方法(以下方法前些日子学习过,不再赘述) addClass() attr() ...

  9. jQuery属性操作(四)

    通过阅读jQuery为属性操作封装的基本方法和为处理兼容性问题提供的hooks,发现jQuery在属性操作方面并没有做过多的设计,只是处理一下兼容性问题,然后调用基础的DOM操作方法.以下是对JQue ...

随机推荐

  1. bioerl 获取gi号

    代码示例: use Bio::DB::EUtilities; my @ids = qw(CAB02640 EAS10332 YP_250808 NP_623143 P41007); my $facto ...

  2. mysql replace into用法详细说明

    From: http://www.cnblogs.com/martin1009/archive/2012/10/08/2714858.html REPLACE的运行与INSERT很相似.只有一点例外, ...

  3. 正则grep

    什么是正则: 正则就是一串有规律的字符串. 正则三剑客: grep/egrep (egrep是grep的扩展),sed, awk grep grep过滤指定关键词 [root@localhost gr ...

  4. mysql 解压版方法

    来自http://zhidao.baidu.com/link?url=RtXb2QKYTQ8Yd5TdTS7XHHiupzDaM19vlVBIrHTVmT7ZHi8kG3O9L6D6nnsfTGE-- ...

  5. Android中利用C++处理Bitmap对象

    相信有些Android&图像算法开发者和我一样,遇到过这样的状况:要对Bitmap对象做一些密集计算(例如逐像素的滤波),但是在java层写循环代码来逐像素操作明显是不现实的,因为Java代码 ...

  6. Masonry插件:内容始终水平居中

    跟随浏览器框架大小,主题内容居中 代码 <!DOCTYPE html> <html> <head> <title>masonry瀑布流插件</ti ...

  7. mongo数据库命令简单学习

    db.getCollection('product').update({status:"offline"},{$set:{status:"online"}},f ...

  8. Node.js之 EventLoop 理解(转)

    关于Node.js的第一个基本概念是I/O操作开销是巨大的: 所以,当前变成技术中最大的浪费来自于等待I/O操作的完成.有几种方法可以解决性能的影响: 同步方式:按次序一个一个的处理请求.利:简单:弊 ...

  9. VC++6.0远程调试(亲试成功)

    0 前言 VS2008及以上远程调试上篇已经讲过,这里再讲下VC++6.0开发环境下的远程调试能力,仅需下面4步即可,更方便的就接着后面的5-6步. 因为目标程序需要在有采集卡等相关硬件支持下的工控机 ...

  10. 【转】ZooKeeper详细介绍和使用第一节

    一.分布式协调技术 在给大家介绍ZooKeeper之前先来给大家介绍一种技术——分布式协调技术.那么什么是分布式协调技术?那么我来告诉大家,其实分布式协调技术 主要用来解决分布式环境当中多个进程之间的 ...