// 添加一个处理兼容获取样式的静态方法
jQuery.getStyle = function( dom, styleName ) {

// dom不是dom,styleName不是字符串,直接打走
if( !jQuery.isDOM( dom ) || !jQuery.isString( styleName ) ) {
return false;
}

// 兼容获取指定的样式
if( window.getComputedStyle ) {
return window.getComputedStyle( dom )[ styleName ];
}else {
return dom.currentStyle[ styleName ];
}
};

// 添加属性和样式操作的方法
jQuery.fn.extend({

// 设置或者获取元素的属性节点
attr: function( attr, val ) {

/*
* 实现思路:
* 1、如果参数的个数为1
* 1.1、这个参数为字符串,那么获取第一个元素指定的属性节点值(getAttribute())并返回。
* 1.2、这个参数为对象,遍历所有的元素,然后再遍历这个对象,
* 把对象中所有的属性值按照属性节点的方式添加给所有元素。
* 2、如果参数的个数为2,遍历所有的元素,
* 以attr为属性节点名,val为属性节点值添加给这些元素。
* 3、链式编程返回this。
* */

var arg = arguments, argLen = arg.length;

// 参数为1
if( argLen === 1 ) {

// 类型为字符串,返回第一个元素指定的属性节点值
if( jQuery.isString( attr ) ) {
return this.get(0).getAttribute( attr );
}

// 类型为对象,遍历所有的元素,然后再遍历这个对象,依次添加遍历到的所有属性节点值
else if( jQuery.isObject( attr ) ) {

/*// 遍历所有元素
for( var i = 0, len = this.length; i < len; i++ ) {

// 遍历传入进来的对象
for( var key in attr ) {

// 给每一个元素设置遍历到的属性节点
this[ i ].setAttribute( key, attr[ key ] );

}
}*/

// 遍历所有元素
this.each( function() {

// 这里的this指向遍历到的每一个元素
var self = this;

// 遍历传入进来的对象
jQuery.each( attr, function( key, val ) {

// 给每一个元素设置遍历到的属性节点
self.setAttribute( key, val );
});
});
}
}

// 参数为2
else if( argLen === 2 ) {

// 两个参数都是字符串,那么给所有元素设置指定的属性节点
if( jQuery.isString( attr ) && jQuery.isString( val ) ) {

this.each( function() {

// 这里的this指向遍历到的每一个元素
this.setAttribute( attr, val );
});
}
}

// 链式编程
return this;
},

// 设置或者获取元素的属性
prop: function( prop, val ) {

/*
* 实现思路:
* 1、如果参数的个数为1
* 1.1、这个参数为字符串,那么获取第一个元素指定的属性并返回。
* 1.2、这个参数为对象,遍历所有的元素,然后再遍历这个对象,
* 把对象中所有的属性值添加给所有元素。
* 2、如果参数的个数为2,遍历所有的元素,
* 以attr为属性名,val为属性值添加给这些元素。
* 3、链式编程返回this。
* */
var argLen = arguments.length;

// 参数为1
if( argLen === 1 ) {

// 类型为字符串,返回第一个元素指定的属性值
if( jQuery.isString( prop ) ) {
return this.get(0)[ prop ];
}

// 类型为对象,遍历所有的元素,然后再遍历这个对象,依次添加遍历到的所有属性值
else if( jQuery.isObject( prop ) ) {

// 遍历所有元素
this.each( function() {

// 这里的this指向遍历到的每一个元素
var self = this;

// 遍历得到所有的属性
jQuery.each( prop, function( key, val ) {

// 给每一个元素分别设置遍历到的属性
self[ key ] = val;
});
});
}
}

// 参数为2
else if( argLen === 2 ) {

// 两个参数都是字符串,那么给所有元素设置指定的属性
if( jQuery.isString( prop ) && jQuery.isString( val ) ) {
this.each( function() {
this[ prop ] = val;
});
}
}

// 链式编程
return this;
},

// 设置或者获取元素的value属性
val: function( val ) {

// 不传参,返回第一个元素的value属性值
if( arguments.length === 0 ) {
return this.get(0).value;
}

// 传参,给所有元素分别设置对应的value属性值
else {
this.each( function() {
this.value = val;
});
}

// 链式编程
return this;
},

// 升级版,复用prop方法实现value属性的获取和设置
_val: function() {
return this.prop.apply( this, [].concat.apply( ['value'], arguments ) );
},

css: function( styleName, val ) {
/*
* 实现思路:
* 1、如果参数的个数为1
* 1.1、这个参数为字符串,那么获取第一个元素指定的样式并返回。
* 1.2、这个参数为对象,遍历所有的元素,然后再遍历这个对象,
* 把对象中所有的样式添加给所有元素。
* 2、如果参数的个数为2,遍历所有的元素,
* 以styleName为样式名,val为样式值添加给这些元素。
* 3、链式编程返回this。
* */

var argLen = arguments.length;

// 参数为1
if( argLen === 1 ) {

// 如果为字符串,那么返回第一个元素指定的样式
if( jQuery.isString( styleName ) ) {
return jQuery.getStyle( this.get(0), styleName );
}

// 如果为对象,遍历所有元素,遍历所有样式,依次给每一个元素设置
else if( jQuery.isObject( styleName ) ) {

this.each( function() {
var self = this;

jQuery.each( styleName, function( key, val ) {
self.style[ key ] = val;
});
});
}
}

// 参数为2
else if( argLen === 2 ) {

// 给所有元素分别设置对应的样式
this.each( function() {
this.style[ styleName ] = val;
});
}

// 链式编程
return this;
},

hasClass: function( className ) {
/*
* 实现思路:
* 1、遍历所有元素
* 2、依次得到每一个元素的className,并加空格处理
* 3、然后用处理过的className判断是否存在某class(也要加空格处理)
* 4、只要有一个存在,就返回true,否则返回false。
* */
for( var i = 0, len = this.length; i < len; i++ ) {

if( (' ' + this[ i ].className + ' ')
.indexOf(' ' + className + ' ' ) > -1 ) {
return true;
}
}

return false;
},

// 判断是否存某class
_hasClass: function( className ) {

var has = false;

this.each( function() {

if( (' ' + this.className + ' ').indexOf(' ' + className + ' ' ) > -1 ) {
has = true;
return false;
}

});

return has;
},

// 批量添加class
addClass: function( classNames ) {
/*
* 实现思路:
* 1、把classNames字符串转换为存储不同class的数组
* 2、遍历所有元素,遍历所有class
* 3、依次判断元素有没有遍历到的class,没有则累加。
* 4、链式编程返回this
* */

classNames = classNames.split(' ');

this.each( function() {

var self = this;

jQuery.each( classNames, function() {

if( !jQuery( self ).hasClass( this + '' ) ) {
self.className += ' ' + this;
}
});
});

return this;
},

// 批量删除class
removeClass: function( classNames ) {
/*
* 实现思路:
* 1、如果没传参
* 1.1. 遍历所有元素,清除每一个元素的class
* 2、如果传参了
* 2.1、把classNames字符串转换为存储不同class的数组
* 2.2、遍历所有元素,遍历所有class
* 2.3、直接替换掉遍历到的class,然后把替换后的class字符串赋给元素
* 3、链式编程返回this
* */

// 不传参,清除全部class
if( arguments.length === 0 ) {
this.each( function() {
this.className = '';
});
}

// 传参,批量删除指定class
else {

classNames = classNames.split(' ');
this.each( function() {

var self = this;

jQuery.each( classNames, function( i, val ){

self.className = self.className.replace( new RegExp( '\\b' + val + '\\b' , 'g' ), '' );
});
});
}

// 链式编程
return this;
},

// 有则删,没则加
toggleClass: function( classNames ) {
/*
* 实现思路:
* 1、把classNames字符串转换为存储不同class的数组
* 2、遍历所有元素,遍历所有class
* 3、有则删除,没则加
* 4、链式编程返回this
* */

classNames = classNames.split(' ');
this.each( function() {

var $self = jQuery(this);

jQuery.each( classNames, function( i, val ) {

if( $self.hasClass( val ) ) {
$self.removeClass( val );
}else {
$self.addClass( val );
}
});
});
}
});

jQuery原生框架-----------------属性操作的更多相关文章

  1. jQuery原生框架-----------------dom操作

    // 扩展DOM操作方法jQuery.fn.extend({ // 设置或者获取元素的内容 html: function( html ) { /* * 实现思路: * 1.不传参,返回第一个元素的内容 ...

  2. jQuery attr removeAttr 属性操作

    jQuery attr removeAttr 属性操作 <%@ page language="java" import="java.util.*" pag ...

  3. jquery 学习(二) - 属性操作

    html代码 <div class="n1" zdy="z1">AAA <p>1111111</p> <input t ...

  4. jQuery对象的属性操作

    jquery的属性操作模块分为四个部分:html属性操作,dom属性操作,类样式操作和值操作 html属性操作:是对html文档中的属性进行读取,设置和移除操作.比如attr().removeAttr ...

  5. jQuery原生框架中的jQuery.fn.extend和jQuery.extend

    extend 方法在 jQuery 中是一个很重要的方法,jQuey 内部用它来扩展静态方法或实例方法,而且我们开发 jQuery 插件开发的时候也会用到它.但是在内部,是存在 jQuery.fn.e ...

  6. jquery对标签属性操作

    jquery中添加属性和删除属性: $("#2args").attr("disabled",'disabled'); $("#2args") ...

  7. jQuery原生框架-----------------核心框架

    // 1.自调防止全局变量污染(function( window ) { var version = '1.0.0'; var document = window.document; var arr ...

  8. jQuery基本的属性操作

    attr和prop,prop常用来操作标签的固有属性,比方说checkbox的checked属性.select的selected属性,而attr常用来操作我们自己给标签添加的属性. $('div'). ...

  9. jQuery原生框架-----------------事件

    jQuery.extend({ // 绑定事件 addEvent: function( ele, type, fn ) { // ele不是DOM,type不是字符串,fn不是函数,打包打走 if( ...

随机推荐

  1. Oracle安装时OracleMTSRecoveryService找不到

    电脑重做系统之后再安装oracle过程中出现一个问题,说OracleMTSRecoveryService找不到指定的目录文件,卸载重装还是没有改变,挣了半天终于找到怎么更改了,打开注册表编辑器,SYS ...

  2. restore database

    RESTORE DATABASE CTSDW FROM DISK = '\\detego-ctsetl\Backup\CTSDW\CTSDW_backup_20160722110003_Full.ba ...

  3. Spring的注解

    Action想使用serviceImpl时,都需要最原始的方法New一个接口,Service service = new serviceImpl();去实例化service了.都需要Action主动创 ...

  4. Python正则式的基本用法

    Python正则式的基本用法 1.1基本规则 1.2重复 1.2.1最小匹配与精确匹配 1.3前向界定与后向界定 1.4组的基本知识 2.re模块的基本函数 2.1使用compile加速 2.2 ma ...

  5. zoj 1788 Quad Trees

    zoj 1788 先输入初始化MAP ,然后要根据MAP 建立一个四分树,自下而上建立,先建立完整的一棵树,然后根据四个相邻的格 值相同则进行合并,(这又是递归的伟大),逐次向上递归 四分树建立完后, ...

  6. gulp入门教程

    第1步:安装Node 首先,最基本也最重要的是,我们需要搭建node环境.访问 nodejs.org,下载完成后直接运行程序,就一切准备就绪.npm会随着安装包一起安装,稍后会用到它. 为了确保Nod ...

  7. Python 对不均衡数据进行Over sample(重抽样)

    需要重采样的数据文件(Libsvm format),如heart_scale +1 1:0.708333 2:1 3:1 4:-0.320755 5:-0.105023 6:-1 7:1 8:-0.4 ...

  8. 深入浅出Mybatis系列(四)---配置详解之typeAliases别名(mybatis源码篇)

    上篇文章<深入浅出Mybatis系列(三)---配置详解之properties与environments(mybatis源码篇)> 介绍了properties与environments, ...

  9. 每个部门绩效成绩第二名 sql server 查询 ( 替代 not in )

    原题: 集团中有多个部门,部门底下有多个员工,求每个部门绩效分数排名第二的人员,数据表结构如下: DEPAR          NAME             SCORE A             ...

  10. 转载:手机网页制作的认识(有关meta标签)

    下面是手机网页的一些认识: 一.<meta name="viewport" id="viewport" content="width=devic ...