挂载到$上的几个属性操作方法分析,发现属性操作用到了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. tablediff工具实用

    1. tablediff 是什么? tablediff 实用工具用于比较两个非收敛的表中的数据,它对于排除复制拓扑中的非收敛故障非常有用. 2. tablediff 用哪些用法? 1) . 在充当复制 ...

  2. mysql 找不到或无法加载已注册的 .Net Framework Data Provider和Unable to find the requested .Net Framework Data Provider. It may not be installed解决

    需要安装 mysql-connector-net-6.7.4.msi 在C盘安装mysql的位置找到三个DLL,复制到Bin文件夹下 在Web.config文件中添加对应配置: <system. ...

  3. 【WP8】关于类库本地化问题

    WPToolkit中的ToggleSwitch开关控件是比较常用的控件,之前在做的的时候遇到一个问题,默认语言改为中文,手机系统语言也为中文,但是开关状态无法应用本地化的语言库,开关状态总是显示On/ ...

  4. spring mvc 框架URL接收中文参数的乱码解决方案

    后台可能就会出现乱码,具体解决方案如下: 一. 配置tomcat目录下的service.xml文件 tomcat7/conf/server.xml 给该行代码加上 URIEncoding=" ...

  5. ubuntu-16.04.1-desktop-amd64.iso:ubuntu-16.04.1-desktop-amd64:安装Oracle11gR2

    特点: 使用ubuntu-16.04.1-desktop-amd64.iso liveCD模式 + Casper-rw 本地文件 不降级默认的gcc版本,(liveCD 自带默认为 gcc 5.4): ...

  6. springmvc+freemarker生成静态html文件

    参考资料: http://mylfd.iteye.com/blog/1896501 http://www.cnblogs.com/xxt19970908/p/5553045.html 个人实践: 1. ...

  7. Tomcat多站点部署方式

    1.同一个Tomcat 同一个端口 部署多个项目 第一步:把待发布的多个项目.war文件放入tomcat的webapps文件下下 第二步:修改 $TOMCAT_HOME\conf 下的server.x ...

  8. SpringBoot------文件上传

    1.pom.xml引入依赖配置 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http ...

  9. 第四章 TCP粘包/拆包问题的解决之道---4.1---

    4.1 TCP粘包/拆包 TCP是一个“流”协议,所谓流,就是没有界限的一串数据.TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可 ...

  10. Floyd 和 bellman 算法

    Floyd-Warshall算法(Floyd-Warshall algorithm)是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题,同时也被用于计算有向图的传递闭包. F ...