jQuery源码解读之removeAttr()方法分析


Posted in Javascript onFebruary 20, 2015

本文较为详细的分析了jQuery源码解读之removeAttr()方法。分享给大家供大家参考。具体分析如下:

扩展jQuery原型对象的方法:

jQuery.fn.extend({

//name,传入要DOM元素要移除的属性名。

    removeAttr: function( name ) {
//使用jQuery.fn对象,即jQuery原型对象的each方法遍历当前选择器选择的jQuery对象数组,并返回该jQuery对象以便链式调用。

        return this.each(function() {

//调用jQuery的全局方法removeAttr,传入遍历出的DOM对象this和要移除的属性名name。

            jQuery.removeAttr( this, name );

        });

    }

});

jQuery的全局方法removeAttr

//扩展jQuery对象的全局方法

jQuery.extend({
//elem为遍历出的每个DOM对象,value为要移除的属性名。

    removeAttr: function( elem, value ) {

        var name, propName,

            i = 0,

//rnotwhite为(/\S+/g)

//如果value为" ",则逻辑与表达式的值为null

//如果value假设为"title href",则由于逻辑与操作符的两个操作数都不是布尔值,则返回第二个操作数,此时attrNames为["title", "href"]。

//match是JavaScript字符串的方法,在字符串内检索指定的值,或找到一个或多个正则表达式的匹配,返回存放匹配结果的数组。其他类型都会报错。

            attrNames = value && value.match( rnotwhite );

//如果attrNames不为null,并且当前DOM对象的节点类型为1,进入if语句块,否则跳出函数,结束本次遍历,开始下次遍历。

        if ( attrNames && elem.nodeType === 1 ) {

//此时attrNames是个装有要移除属性名的数组,即["title", "href"]

//执行while循环,这种写法的意思是,先从attrNames取出一个元素赋值给name, i自增1,然后判断name是否有值,有值,进入循环执行,执行完毕后开始下次循环,直到name无值,跳出循环。

            while ( (name = attrNames[i++]) ) {

//如果属性名与js关键字同名的如"for"和"class",替换为"htmlFor"和"className"。

                propName = jQuery.propFix[ name ] || name;
//如果是布尔值属性特别对待

                if ( jQuery.expr.match.bool.test( name ) ) {

//getSetInput检测Input元素是否支持getAttribute("value")

//getSetAttribute检测是否支持设置驼峰命名格式的属性名

//!ruseDefault.test( name )不区分大小写检测name是否是checked或者selected属性,

                    if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {

//移除布尔值属性实际上是给布尔值属性赋值为false

                        elem[ propName ] = false;

                    } else {

//支持ie9以下

//将"default-checked"这种属性转换为"defaultChecked",并赋值false

                        elem[ jQuery.camelCase( "default-" + name ) ] =

                            elem[ propName ] = false;

                    }

                } else {

//如果不是布尔值属性,调用jQuery的全局attr方法设置属性

                    jQuery.attr( elem, name, "" );

                }

//getSetAttribute用来测试setAttribute是否支持设置驼峰命名形式的属性名,如果可以,在使用setAttribute和getAttribute时,需要使用修正后的属性名。(兼容ie6/7)

//如果getSetAttibute等于false,说明不支持,则使用修正后的属性名,支持,使用原始的属性名。

//调用DOM原生的removeAttribute方法,移除属性

                elem.removeAttribute( getSetAttribute ? name : propName );

            }

        }

    }

});

关键字属性修正
jQuery.extend({

    propFix: {

        "for": "htmlFor",

        "class": "className"

    }

});

jQuery.extend({

    camelCase: function( string ) {

        return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );

    }

});

var nodeHook, boolHook,

    attrHandle = jQuery.expr.attrHandle,

    ruseDefault = /^(?:checked|selected)$/i,

    getSetAttribute = support.getSetAttribute,

    getSetInput = support.input;

// Setup

div = document.createElement( "div" );

div.setAttribute( "className", "t" );

div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";

a = div.getElementsByTagName("a")[ 0 ];

// First batch of tests.

select = document.createElement("select");

opt = select.appendChild( document.createElement("option") );

input = div.getElementsByTagName("input")[ 0 ];

a.style.cssText = "top:1px";

// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)

support.getSetAttribute = div.className !== "t";

检测input是否支持getAttribute("value")

// Support: IE8 only

// Check if we can trust getAttribute("value")

input = document.createElement( "input" );

input.setAttribute( "value", "" );

support.input = input.getAttribute( "value" ) === "";

检测是否布尔值属性

booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
matchExpr = {

    "bool": new RegExp( "^(?:" + booleans + ")$", "i" )

},

希望本文所述对大家的jQuery程序设计有所帮助。

Javascript 相关文章推荐
IE6下js通过css隐藏select的一个bug
Aug 16 Javascript
基于jquery实现轮播特效
Apr 22 Javascript
js实现颜色阶梯渐变效果(Gradient算法)
Mar 21 Javascript
详解Angular2组件之间如何通信
Jun 22 Javascript
Angularjs中的验证input输入框只能输入数字和小数点的写法(推荐)
Aug 16 Javascript
js原生方法被覆盖,从新赋值原生的方法
Jan 02 Javascript
微信小程序websocket实现聊天功能
Mar 30 Javascript
用vscode开发vue应用的方法步骤
May 06 Javascript
jQuery控制input只能输入数字和两位小数的方法
May 16 jQuery
深入学习JavaScript 高阶函数
Jun 11 Javascript
解决Vue中的生命周期beforeDestory不触发的问题
Jul 21 Javascript
前端性能优化建议
Sep 17 Javascript
JS实现5秒钟自动封锁div层的方法
Feb 20 #Javascript
js实现感应鼠标图片透明度变化的方法
Feb 20 #Javascript
js实现鼠标感应向下滑动隐藏菜单的方法
Feb 20 #Javascript
js实现鼠标滚轮控制图片缩放效果的方法
Feb 20 #Javascript
IE及IE6浏览器中判断JS文件加载成功失败的方法
Feb 18 #Javascript
使用JavaScript开发IE浏览器本地插件实例
Feb 18 #Javascript
JQuery实现展开关闭层的方法
Feb 17 #Javascript
You might like
php mssql 日期出现中文字符的解决方法
2009/03/10 PHP
PHP+MySQL实现输入页码跳转到指定页面功能示例
2018/06/01 PHP
PHP标准库(PHP SPL)详解
2019/03/16 PHP
php使用filter_var函数判断邮箱,url,ip格式示例
2019/07/06 PHP
JavaScript 关键字屏蔽实现函数
2009/08/02 Javascript
jQuery对象和DOM对象使用说明
2010/06/25 Javascript
jQuery中:focus选择器用法实例
2014/12/30 Javascript
jQuery实现仿QQ空间装扮预览图片的鼠标提示效果代码
2015/10/30 Javascript
nodejs 中模拟实现 emmiter 自定义事件
2016/02/22 NodeJs
浅析BootStrap模态框的使用(经典)
2016/04/29 Javascript
微信小程序利用co处理异步流程的方法教程
2017/05/20 Javascript
Vue数组更新及过滤排序功能
2017/08/10 Javascript
分析JS单线程异步io回调的特性
2017/12/01 Javascript
基于vue.js中事件修饰符.self的用法(详解)
2018/02/23 Javascript
Vue拖拽组件开发实例详解
2018/05/11 Javascript
Vue-cli配置打包文件本地使用的教程图解
2018/08/02 Javascript
layui radio单选限制下一个radio单选的实例
2019/09/03 Javascript
vue中使用vue-pdf的方法详解
2020/09/05 Javascript
Python中Collection的使用小技巧
2014/08/18 Python
零基础写python爬虫之HTTP异常处理
2014/11/05 Python
python将一组数分成每3个一组的实例
2018/11/14 Python
利用python求积分的实例
2019/07/03 Python
Python 占位符的使用方法详解
2019/07/10 Python
解决Django Static内容不能加载显示的问题
2019/07/28 Python
python爬虫 urllib模块url编码处理详解
2019/08/20 Python
基于Tensorflow使用CPU而不用GPU问题的解决
2020/02/07 Python
关于Python 解决Python3.9 pandas.read_excel(‘xxx.xlsx‘)报错的问题
2020/11/28 Python
英国剑桥包官网:The Cambridge Satchel Company
2016/08/01 全球购物
写自荐信有哪些不宜?
2013/10/17 职场文书
酒店执行总经理岗位职责
2013/12/15 职场文书
高一自我鉴定
2013/12/17 职场文书
教育科研先进个人材料
2014/01/26 职场文书
《两个铁球同时着地》教学反思
2014/02/13 职场文书
党员公开承诺践诺书
2014/03/25 职场文书
500字作文之难忘的同学
2019/12/20 职场文书
vue+spring boot实现校验码功能
2021/05/27 Vue.js