jQuery的属性模块提供了如下方法
attr/removeAttr
prop/removeProp(1.6)
addClass/removeClass/toggleClass/hasClass
val
提供了几个静态方法以支持JQ对象以上方法,如jQuery.attr 对应 attr,即jq对象的attr方法内部调用了jQuery.attr。其次还有
jQuery.removeAttr -> removeAttr
jQuery.prop -> prop
看代码可发现attr和prop方法中都直接调用的是jQuery.access
attr: function( name, value ) {
return jQuery.access( this, name, value, true, jQuery.attr );
},
prop: function( name, value ) {
return jQuery.access( this, name, value, true, jQuery.prop );
},
最后一个参数分别是jQuery.attr,jQuery.prop。可以想象在jQuery.access中会调用传入的这个函数。下面是jQuery.access的源码
access: function( elems, key, value, exec, fn, pass ) {
var length = elems.length;
// Setting many attributes
if ( typeof key === "object" ) {
for ( var k in key ) {
jQuery.access( elems, k, key[k], exec, fn, value );
}
return elems;
}
// Setting one attribute
if ( value !== undefined ) {
// Optionally, function values get executed if exec is true
exec = !pass && exec && jQuery.isFunction(value);
for ( var i = 0; i < length; i++ ) {
fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
}
return elems;
}
// Getting an attribute
return length ? fn( elems[0], key ) : undefined;
},
当 设置/获取属性的时候遍历jQuery对象,依次调用fn函数。这里的fn可能是jQuery.attr和jQuery.prop。
需要注意的是这里用for遍历elems,这个elems实际是jQuery对象,jQuery对象它是一个ArrayLike。
大概就是如此,剩下的一堆hooks是用来解决浏览器兼容性的问题。如jQuery.attrHooks、jQuery.propHooks、jQuery.valHooks。列举如下
1,IE6/7不完全支持setAttribute,比如不能设置class,for等属性
2,IE6/7中getAttribute获取href / src 属性(相对路径)值与其它浏览器不同
4,IE6/7不支持setAttribute设置style / 不支持getAttribute获取style属性值
5,获取tabIndex属性有差异
6,布尔类型属性的修复,如selected,disabled,checked等
7,select和option元素的值修复