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 相关文章推荐
获取DOM对象的几种扩展及简写
Oct 09 Javascript
javascript options属性集合操作代码
Dec 28 Javascript
js function定义函数使用心得
Apr 15 Javascript
jquery按回车键实现表单提交的简单实例
May 25 Javascript
JavaScript必知必会(二) null 和undefined
Jun 08 Javascript
js日期相关函数dateAdd,dateDiff,dateFormat等介绍
Sep 24 Javascript
DataTables+BootStrap组合使用Ajax来获取数据并且动态加载dom的方法(排序,过滤,分页等)
Nov 09 Javascript
在vue中实现点击选择框阻止弹出层消失的方法
Sep 15 Javascript
Vue中 v-if/v-show/插值表达式导致闪现的原因及解决办法
Oct 12 Javascript
vue项目中锚点定位替代方式
Nov 13 Javascript
javascript 设计模式之享元模式原理与应用详解
Apr 08 Javascript
js中复选框的取值及赋值示例详解
Oct 18 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
全国FM电台频率大全 - 1 北京市
2020/03/11 无线电
CodeIgniter php mvc框架 中国网站
2008/05/26 PHP
php 动态多文件上传
2009/01/18 PHP
PHP 自定义错误处理函数trigger_error()
2013/03/26 PHP
解析php中memcache的应用
2013/06/18 PHP
PHP上传图片、删除图片简单实例
2016/11/12 PHP
PHP新特性之字节码缓存和内置服务器
2017/08/11 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
2018/06/14 PHP
laravel-admin 在列表页添加自定义按钮的例子
2019/09/30 PHP
一个用js实现控制台控件的代码
2007/09/04 Javascript
鼠标经过的文本框textbox变色
2009/05/21 Javascript
jQuery 隔行换色 支持键盘上下键,按Enter选定值
2009/08/02 Javascript
JavaScript获取和设置CheckBox状态的简单方法
2013/07/05 Javascript
jQuery .tmpl() 用法示例介绍
2014/08/21 Javascript
JS动态创建DOM元素的方法
2015/06/09 Javascript
javascript学习笔记整理(概述、变量、数据类型简介)
2015/10/25 Javascript
JavaScript实现简单获取当前网页网址的方法
2015/11/09 Javascript
基于javascript实现表格的简单操作
2016/05/21 Javascript
nodejs mysql 实现分页的方法
2017/06/06 NodeJs
nodejs后台集成ueditor富文本编辑器的实例
2017/07/11 NodeJs
Web安全之XSS攻击与防御小结
2018/12/13 Javascript
JavaScript实现串行请求的示例代码
2020/09/14 Javascript
python和pyqt实现360的CLable控件
2014/02/21 Python
Python数据类型详解(三)元祖:tuple
2016/05/08 Python
浅谈Python 多进程默认不能共享全局变量的问题
2019/01/11 Python
详解python3 + Scrapy爬虫学习之创建项目
2019/04/12 Python
Prometheus开发中间件Exporter过程详解
2020/11/30 Python
CSS3+font字体文件实现圆形半透明菜单具体步骤(图解)
2013/06/03 HTML / CSS
C语言中break与continue的区别
2012/07/12 面试题
促销活动总结
2014/04/28 职场文书
酒店员工培训方案
2014/06/02 职场文书
工程部主管岗位职责
2015/02/12 职场文书
主题班会开场白
2015/06/01 职场文书
2019升学宴主持词范本5篇
2019/10/09 职场文书
关于python中readlines函数的参数hint的相关知识总结
2021/06/24 Python
Java 关于String字符串原理上的问题
2022/04/07 Java/Android