挂载到$上的几个属性操作方法分析,发现属性操作用到了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. 文本处理三剑客之 sed详解

    1.简介 sed是非交互式的编辑器,它不会修改文件,除非使用shell重定向来保存结果.默认情况下,所有的输出行都被打印到屏幕上. sed编辑器逐行处理文件(或输入),并将结果发送到屏幕.具体过程如下 ...

  2. VMware安装与VMware下安装CentOS系统

    1.下载安装VMware,我安装的是VMware 12.VMware从11开始不再支持32位系统,32位系统请安装VMware10. VMware官方功能特性介绍http://www.vmware.c ...

  3. 实现mysql按月统计的教程

    From: http://www.jbxue.com/db/758.html 实现mysql按月统计的教程   mysql有个字段是DATETIME类型,要实现可以按月统计,该怎么写sql语句? se ...

  4. iOS:第三方库使用非ARC编译

    iOS: 解决某些第三方库因为ARC不能使用的问题 1.在target下面的build phases下有一个compile source,下面有很多待编译文件.可以看到一个compile flag,可 ...

  5. 【转】MongoDB学习笔记(查询)

    原文地址 MongoDB学习笔记(查询) 基本查询: 构造查询数据. > db.test.findOne() { "_id" : ObjectId("4fd58ec ...

  6. 安装MySQL后经常弹出taskeng.exe~

    taskeng.exe,是Microsoft任务计划程序引擎调用的安全进程.文件路径为C:\Windows\system32\taskeng.exe.大小165KB. 解决办法:  这个问题是Wind ...

  7. Linux/Centos下/lib64/libc.so.6: version `GLIBC_2.14' not found问题

    Centos的某个版本下编译了一个可执行程序,复制到另外一个Centos环境下去执行,结果出现了以下错误: /lib64/libc.so.6: version `GLIBC_2.14' not fou ...

  8. go反射的规则

    第一次知道反射的时候还是许多年前在学校里玩 C# 的时候.那时总是弄不清楚这个复杂的玩意能有什么实际用途……然后发现 Java 有这个,后来发现 PHP 也有了,再后来 Objective-C.Pyt ...

  9. ssh面试题总结

    SSH面试题总结: 题目1:Hibernate工作原理及为什么要用? 原理: hibernate,通过对jdbc进行封装,对 java类和 关系数据库进行mapping,实现了对关系数据库的面向对象方 ...

  10. mongodb 初学 目录

    mongodb 初学 索引 啦啦啦 MongoDB 教程 NoSQL 简介 MongoDB 简介 Windows 平台安装 MongoDB Linux平台安装MongoDB mongodb 在 Ubu ...