jQuery val()方法源码解读

    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

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。