jQuery属性操作(三)
在阅读attr、remove方法时,看到一些对浏览器兼容性做处理的hooks。接下来看一下这些hooks都做了哪些兼容性处理
1、attrHooks。主要处理IE6-9 input的type属性无法写入的问题。
attrHooks: {
type: {
set: function( elem, value ) {
// 如果value是radio,并且elem是input
if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
var val = elem.value;
elem.setAttribute( "type", value );
if ( val ) {
elem.value = val;
}
return value;
}
}
}
}
当用户调用attr(elem, name, value)方法为elem添加属性时,jQuery通过调用jQuery.ttrHooks[name],看是否该元素的该属性是否存在对应的hooks,
如果存在则返回该hooks,则调用该hooks的set方法为elem设置属性。
2、boolHook 处理属性值是ture或false的情况
boolHook = {
set: function( elem, value, name ) {
// 如果value是false,直接删除该属性
if ( value === false ) {
jQuery.removeAttr( elem, name );
// 否则将该属性的值设置为何名称相同。例如:checked=“checked”
} else {
elem.setAttribute( name, name );
}
// 返回属性名
return name;
}
};
3、propHooks 处理通过prop方法获取元素属性时的情况。jQuery中直接给propHooks的属性只有tabIndex,但后续又动态加入很多。
propHooks: {
// tabIndex属性是指定按tab键时,光标focus的先后顺序,主要指定给表单元素或链接。
tabIndex: {
get: function( elem ) {
// 如果该元素有tabindex属性,或者该元素时可focus元素,或者是链接,返回elem的tabIndex,否则返回-1
return elem.hasAttribute( "tabindex" ) || rfocusable.test( elem.nodeName ) || elem.href ?
elem.tabIndex :
-1;
}
}
}
4、为propHooks增加了selected属性
if ( !jQuery.support.optSelected ) {
jQuery.propHooks.selected = {
get: function( elem ) {
var parent = elem.parentNode;
if ( parent && parent.parentNode ) {
parent.parentNode.selectedIndex;
}
return null;
}
};
}
5、valHooks
valHooks: {
option: {
// 处理获取option值的兼容性。
get: function( elem ) {
var val = elem.attributes.value;
return !val || val.specified ? elem.value : elem.text;
}
},
// 处理得到或设置select值的兼容性问题,对原生js不熟悉,读起来好费劲。。。
select: {
get: function( elem ) {
var value, option,
// 得到select中所有的options
options = elem.options,
// 得到被选中的option的index
index = elem.selectedIndex,
// 用于后面初始化values提供依据,检测elem是单选select还是复选
one = elem.type === "select-one" || index < 0,
// 如果one为true则values初始化null,否则初始化为空数组
values = one ? null : [],
// 初始化max(有多少个option)
max = one ? index + 1 : options.length,
i = index < 0 ?
max :
one ? index : 0;
// Loop through all the selected options
for ( ; i < max; i++ ) {
option = options[ i ];
if ( ( option.selected || i === index ) &&
( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) &&
( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
value = jQuery( option ).val();
// 如果是单选select,返回value
if ( one ) {
return value;
}
// 否则,如果是多选select,将value放入values数组中
values.push( value );
}
}
// 当是多选select时,返回所有的values
return values;
},
// 设置select的值
set: function( elem, value ) {
var optionSet, option,
// 拿到所有的option
options = elem.options,
// 将value转换成数组
values = jQuery.makeArray( value ),
// 得到option的个数
i = options.length;
// 遍历所有的option
while ( i-- ) {
option = options[ i ];
// 如果当前option的value在values数组中
if ( (option.selected = jQuery.inArray( jQuery(option).val(), values ) >= 0) ) {
// 则设置optionSet为true
optionSet = true;
}
}
// 遍历之后,如果optionSet仍为是false,说明没有被选中的option,设置select值失败
if ( !optionSet ) {
elem.selectedIndex = -1;
}
return values;
}
}
},
// 处理获取或设置radio和checkbox值的兼容性
jQuery.each([ "radio", "checkbox" ], function() {
jQuery.valHooks[ this ] = {
set: function( elem, value ) {
// 如果value是数组
if ( jQuery.isArray( value ) ) {
// 如果该属性的value在数组中,则将该元素设置为被选中
return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
}
}
};
// 如果浏览器不支持checkOn(?)
if ( !jQuery.support.checkOn ) {
jQuery.valHooks[ this ].get = function( elem ) {
return elem.getAttribute("value") === null ? "on" : elem.value;
};
}
});
6、propFix 建立html属性和js中对应属性的对应关系(html属性都是小写,js中采用的是驼峰标识)
// 首先直接添加两个特殊的属性对应关系
propFix: {
"for": "htmlFor",
"class": "className"
},
// 然后遍历数组,建立html(小写)和js(驼峰)的对应关系
jQuery.each([
"tabIndex",
"readOnly",
"maxLength",
"cellSpacing",
"cellPadding",
"rowSpan",
"colSpan",
"useMap",
"frameBorder",
"contentEditable"
], function() {
// 将小写的形式作为键,驼峰的形式作为值
jQuery.propFix[ this.toLowerCase() ] = this;
});
jQuery属性操作(三)的更多相关文章
- jquery——属性操作、特殊效果
1. attr().prop() 取出或者设置某个属性的值 <!DOCTYPE html> <html lang="en"> <head> &l ...
- jQuery属性操作
jQuery 的属性操作的核心部分其实就是对底层 getAttribute().setAttributes()等方法的一系列兼容性处理 ...if ( notxml ) { name = name.t ...
- jQuery源代码学习之八——jQuery属性操作模块
一.jQuery属性模块整体介绍 jQuery的属性操作模块分四个部分:html属性操作,dom属性操作,类样式操作,和值操作. html属性操作(setAttribute/getAttribute) ...
- python全栈开发day48-jqurey自定义动画,jQuery属性操作,jQuery的文档操作,jQuery中的ajax
一.昨日内容回顾 1.jQuery初识 1).使用jQuery而非JS的六大理由 2).jQuery对象和js对象转换 3).jQuery的两大特点 4).jQuery的入口函数三大写法 5).jQu ...
- jQuery属性操作(二)
挂载到$上的几个属性操作方法分析,发现属性操作用到了sizzle封装的方法 attr: function( elem, name, value ) { var hooks, ret, ...
- web前端----jQuery属性操作
知识点总结 1.属性 属性(如果你的选择器选出了多个对象,那么默认只会返回出第一个属性). attr(属性名|属性值) - 一个参数是获取属性的值,两个参数是设置属性值 - 点击加载图片示例 remo ...
- 前端之JQuery:JQuery属性操作
Jquery2--属性相关的操作 知识点总结 1.属性 属性(如果你的选择器选出了多个对象,那么默认只会返回出第一个属性). attr(属性名|属性值) - 一个参数是获取属性的值,两个参数是设置属性 ...
- jQuery 属性操作和CSS 操作
如有在jQuery方法中涉及到函数,此函数必定会返回一个数值(函数由于运行次数不同触发一些不同效果) jQuery 属性操作方法(以下方法前些日子学习过,不再赘述) addClass() attr() ...
- jQuery属性操作总结
jquery属性包括以下几个: attr(name|pro|key,val|fn) removeAttr(name) prop(n|p|k,v|f)1.6+ removeProp(name)1.6+ ...
- jQuery属性操作(四)
通过阅读jQuery为属性操作封装的基本方法和为处理兼容性问题提供的hooks,发现jQuery在属性操作方面并没有做过多的设计,只是处理一下兼容性问题,然后调用基础的DOM操作方法.以下是对JQue ...
随机推荐
- php判断文件存在是用file_exists 还是 is_file
From: http://www.php100.com/html/php/hanshu/2013/0905/4672.html [导读] 在写程序时发现在判断文件是否存在时,有两种写法,有的人用了is ...
- 炫酷霸气的HTML5/jQuery应用及源码
也许在5年前,HTML5还是一种很前卫的技术,大家还只是将它当做实验来看待,更别说产品应用了.但是现在HTML5已经非常流行,无论从PC端还是移动端,HTML5都扮演着非常重要的角色.今天我们要分享的 ...
- Maven最佳实践-distributionManagement
分发构件至远程仓库 mvn install 会将项目生成的构件安装到本地Maven仓库,mvn deploy 用来将项目生成的构件分发到远程Maven仓库.本地Maven仓库的构件只能供当前用户使用, ...
- Windows7双系统卸载Ubuntu
正确的删除ubuntu方法如下: 第1步,修复MBR 1.进入win7,下载个软件MbrFix.exe,放在C:\windows\system32文件夹中 2.点击开始>所有程序>附件&g ...
- cocos2d - Changing the image of a CCSprite
CCTexture2D* tex = [[CCTextureCache sharedTextureCache] addImage:@"new_image_name"]; [spri ...
- iredmail邮件服务器之修改默认的web服务端口号
安装iredmail之后,由于需要在路由器上做端口映射以便在外网访问webmail,因此端口不能和WEB服务的端口好冲突,所以需要修改邮件服务器的httpd服务的端口. 一.apache/httpd的 ...
- 安卓开发笔记——Fragment+FragmentTabHost组件(实现新浪微博底部菜单)
记得之前写过2篇关于底部菜单的实现,由于使用的是过时的TabHost类,虽然一样可以实现我们想要的效果,但作为学习,还是需要来了解下这个新引入类FragmentTabHost 之前2篇文章的链接: 安 ...
- JS_SINA股票接口
深成指: <script type="text/javascript" src="http://hq.sinajs.cn/list=sz399001" c ...
- QT编译错误:undefined reference to `__imp_gl*'等等
学习QT OpenGL绘制图形,程序中使用了OpenGL的API函数(gl开头),但是编译出现了错误:截图如下 有过编程经验的人可知,是链接的时候出错,找不到函数的实现! 解决方法:在工程*.pro文 ...
- 【转】Redis集群搭建与简单使用
介绍安装环境与版本 用两台虚拟机模拟6个节点,一台机器3个节点,创建出3 master.3 salve 环境. redis 采用 redis-3.2.4 版本. 两台虚拟机都是 CentOS ,一台 ...