jQuery属性操作之.val()函数
程序员文章站
2022-03-12 19:50:03
@[toc] .val()实例方法的三种用法 1. $('xxx').val() : 获取匹配的元素集合中第一个元素的当前value属性值(property) 2. $('xxx').val(value) : 设置匹配的元素集合中每个元素的value属性值(property) 3. $('xxx') ......
目录
- .val()实例方法的三种用法
- .val()函数源码
- 调用形式:$('xxx').val();
- 调用形式:$('xxx').val(value);
- 调用形式:$('xxx').val(function(index,value){});
@
.val()实例方法的三种用法
- $('xxx').val() : 获取匹配的元素集合中第一个元素的当前value属性值(property)
- $('xxx').val(value) : 设置匹配的元素集合中每个元素的value属性值(property)
- $('xxx').val(function(index,value){}) :
-
钩子函数未设置或无效时,将函数function(index,value)的返回值设为每一个dom元素的value属性值(property).
- 其中,两个形参不需要传值,index指代当前dom元素的在jquery对象中的索引,value指代当前dom对象的旧的value属性值.
.val()函数源码
jquery.fn.extend( { val: function( value ) { var hooks, ret, isfunction, elem = this[ 0 ]; //elem为jquery对象匹配的第一个dom元素 //无参数传入时 if ( !arguments.length ) { if ( elem ) { //如果jquery有匹配到dom元素的话 //钩子判断与执行:匹配用户自定义的钩子函数,并执行和返回 hooks = jquery.valhooks[ elem.type ] || //如果valhooks有type属性,赋值对应钩子 jquery.valhooks[ elem.nodename.tolowercase() ]; //如果valhooks有与dom节点名相关的属性,赋值对应钩子 if ( // 如果定义了钩子及相关方法,调用钩子函数处理并返回 hooks && "get" in hooks && ( ret = hooks.get( elem, "value" ) ) !== undefined ) { return ret; } ret = elem.value; //无钩子时,直接取元素的value值 return typeof ret === "string" ? // 返回字符串:处理一般情况下的返回值 ret.replace( rreturn, "" ) : // 返回非字符串:value为null/undefined,返回空串;其余情况,返回ret ret == null ? "" : ret; } return; //如果jquery对象未匹配到dom元素时,直接返回 } //传入一个参数时的情况:函数,非函数 isfunction = jquery.isfunction( value ); //判断传入参数是否为函数,为后续条件开关做准备 return this.each( function( i ) { //实例方法.each():对匹配到的每一个dom元素,执行括号中的函数:obj[i].callback(i); var val; if ( this.nodetype !== 1 ) { //当前dom元素不为元素节点时,直接返回 return; } if ( isfunction ) { //如果传入参数为函数类型,val=obj[i].value(i,obj的value属性值) val = value.call( this, i, jquery( this ).val() ); //[注:value的两个形参,我们不用给它手动传值,会在val函数内部自动传值,一个代表dom元素的索引,一个代表dom元素当前的value属性的值] } else { val = value; //如果传入参数不为函数类型,val=传入参数; } // 将val为null/undefined的情况,统一处理为空串 if ( val == null ) { val = ""; } else if ( typeof val === "number" ) { val += ""; } else if ( jquery.isarray( val ) ) { val = jquery.map( val, function( value ) { return value == null ? "" : value + ""; } ); } //有传参的情况下的,钩子判断与执行:匹配用户自定义的钩子函数,并执行和返回 hooks = jquery.valhooks[ this.type ] || jquery.valhooks[ this.nodename.tolowercase() ]; // 如果钩子的"set"属性未定义,仍旧返回上面一般情况下处理的结果 if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { this.value = val; } } ); } } );
调用形式:$('xxx').val();
相关代码:
var hooks, ret, isfunction, elem = this[ 0 ]; //elem为jquery对象匹配的第一个dom元素 //无参数传入时 if ( !arguments.length ) { if ( elem ) { //如果jquery有匹配到dom元素的话 //钩子判断与执行:匹配用户自定义的钩子函数,并执行和返回 hooks = jquery.valhooks[ elem.type ] || //如果valhooks有type属性,赋值对应钩子 jquery.valhooks[ elem.nodename.tolowercase() ]; //如果valhooks有与dom节点名相关的属性,赋值对应钩子 if ( // 如果定义了钩子及相关方法,调用钩子函数处理并返回 hooks && "get" in hooks && ( ret = hooks.get( elem, "value" ) ) !== undefined ) { return ret; } ret = elem.value; //无钩子时,直接取元素的value值 return typeof ret === "string" ? // 返回字符串:处理一般情况下的返回值 ret.replace( rreturn, "" ) : // 返回非字符串:value为null/undefined,返回空串;其余情况,返回ret ret == null ? "" : ret; } return; //如果jquery对象未匹配到dom元素时,直接返回 }
说明:
1.jquery对象没有匹配到dom元素时,直接返回.
2.先进行钩子函数相关的判断(调用),如果钩子满足以下几个条件,执行钩子函数并返回:
- 钩子之中存在type属性 或者 存在与当前dom元素节点同名的属性
- 钩子之中存在get属性
- 调用get,得到的返回值不为undefined
3.否则,返回elem的value属性的属性值.
调用形式:$('xxx').val(value);
相关代码:
if ( isfunction ) { //如果传入参数为函数类型,val=obj[i].value(i,obj的value属性值) val = value.call( this, i, jquery( this ).val() ); } else { val = value; //如果传入参数不为函数类型,val=传入参数; } //有传参的情况下的,钩子判断与执行:匹配用户自定义的钩子函数,并执行和返回 hooks = jquery.valhooks[ this.type ] || jquery.valhooks[ this.nodename.tolowercase() ]; // 如果钩子的判断不通过,仍旧返回上面一般情况下处理的结果 if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { this.value = val; }
说明:(value为非函数类型情况下)
1.同样,先进行钩子的判断,如果满足以下几个条件,if条件判断语句中的三个表达式依次执行,设置好当前dom元素value属性值:
- 钩子之中存在type属性 或者 存在与当前dom元素节点同名的属性
- 钩子之中存在set属性
- 调用set,得到的返回值不为undefined
2.否则,直接设置当前dom元素的value属性值为传入的参数
调用形式:$('xxx').val(function(index,value){});
相关代码:
if ( isfunction ) { //如果传入参数为函数类型,val=obj[i].value(i,obj的value属性值) val = value.call( this, i, jquery( this ).val() ); //[注:value的两个形参,我们不用给它手动传值,会在val函数内部自动传值,一个代表dom元素的索引,一个代表dom元素当前的value属性的值] } else { val = value; //如果传入参数不为函数类型,val=传入参数; } // 将val为null/undefined的情况,统一处理为空串 if ( val == null ) { val = ""; } else if ( typeof val === "number" ) { val += ""; } else if ( jquery.isarray( val ) ) { val = jquery.map( val, function( value ) { return value == null ? "" : value + ""; } ); } //有传参的情况下的,钩子判断与执行:匹配用户自定义的钩子函数,并执行和返回 hooks = jquery.valhooks[ this.type ] || jquery.valhooks[ this.nodename.tolowercase() ]; // 如果钩子的"set"属性未定义,仍旧返回上面一般情况下处理的结果 if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { this.value = val; }
说明:(value为函数类型情况下)
1.令val=obj[i].value(i,jquery( this ).val());
[注]
- value函数两个形参由本函数自动传值,自行传值无效.
- 传参i-当前dom元素在jquery对象中的索引值
- 传参jquery( this ).val()-将当前dom元素包装为jquery对象,以便以无参形式调用val方法得到的value属性旧值.
2.同样,先进行钩子的判断,如果满足以下几个条件,if条件判断语句中的三个表达式依次执行,设置好当前dom元素value属性值:
- 钩子之中存在type属性 或者 存在与当前dom元素节点同名的属性
- 钩子之中存在set属性
- 调用set,得到的返回值不为undefined
3.否则,直接设置val为当前元素的value属性值
下一篇: 倒计时按钮—获取手机验证码按钮