val: function( value ) { var hooks, ret, isFunction, elem = this[0]; if ( !arguments.length ) {//无参数 if ( elem ) {//第一个元素 //考虑元素是checkbox,radio,option或者select的情况,这时有val钩子 hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ]; //如果钩子存在且有get 且获取的值不为undefined,返回该值 if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { return ret; } //否则,ret就是元素的value ret = elem.value; //如果值是字符串 return typeof ret === "string" ? //将换行符替换为"" ret.replace(rreturn, "") : // 如果值不是字符串,考虑null和undefined的情况,如果是null或undefined,ret置为"" ret == null ? "" : ret; } return; } //判断传入的参数value是否是函数 isFunction = jQuery.isFunction( value ); //遍历设值 return this.each(function( i ) { var val; if ( this.nodeType !== 1 ) {//如果不是元素节点,返回 return; } if ( isFunction ) {//如果是函数 函数的参数第一个是索引,第二个是对应的值 val = value.call( this, i, jQuery( this ).val() ); } else { val = value; } //如果val是null或者undefined,设为"" if ( val == null ) { val = ""; //如果val是数字,转为字符串 } else if ( typeof val === "number" ) { val += ""; //如果val是数组 } else if ( jQuery.isArray( val ) ) {//处理数组中的undefined null 和数字 val = jQuery.map( val, function( value ) { return value == null ? "" : value + ""; }); } //同样地,考虑元素是checkbox,radio,option或者select的情况 hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; // 如果set返回了undefined,回退到正常值val if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { this.value = val; } }); }
valHooks to be continue
时间: 2024-10-31 21:14:29