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;
            }
        } );
    }
} );   相关代码:
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.先进行钩子函数相关的判断(调用),如果钩子满足以下几个条件,执行钩子函数并返回:
3.否则,返回elem的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属性值:
2.否则,直接设置当前DOM元素的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());
[注]
2.同样,先进行钩子的判断,如果满足以下几个条件,if条件判断语句中的三个表达式依次执行,设置好当前DOM元素value属性值:
3.否则,直接设置val为当前元素的value属性值
来源:https://www.cnblogs.com/peterzhangsnail/archive/2018/12/02/10054533.html
本文内容仅供个人学习/研究/参考使用,不构成任何决策建议或专业指导。分享/转载时请标明原文来源,同时请勿将内容用于商业售卖、虚假宣传等非学习用途哦~感谢您的理解与支持!
 在网络上也时不时会看到,“是时候和jQuery说拜拜了”,最著名的莫过于在2013年的这篇文章You Might Not Need jQuery。
 15个jQuery小技巧:返回顶部按钮,预加载图像,检查图像是否加载,自动修复破坏的图像,悬停切换类,禁用输入字段,停止加载链接,淡入/滑动切换,简单的手风琴...
jquery插件是用来扩展jquery对象的一种方法,它的使用方法是通过jquery对象$来调用。其中Jquery插件开发一共有三种方式:$.extend(),$.fn,$.widget()
 在JQuery中,可以使用trigger()方法完成模拟操作,trigger()方法不仅能触发浏览器支持的具有相同名称的事件,也可以触发自定义名称的事件。rigger(type[,data])方法有两个参数
在高版本的jquery引入prop方法后,什么时候该用prop?什么时候用attr?对于HTML元素本身就带有的固有属性,在处理时,使用prop方法。对于HTML元素我们自己自定义的DOM属性,在处理时,使用attr方法。
jquery是对js语言的封装、扩展,实现了对浏览器的兼容,使用jquery能让操作更方便简洁,这篇文章主要讲解原生js中Dom对象和jquery对象的相互转换。
 在使用jquery.pagination.js插件的时候,会出现pagination is not a function的错误,这是什么原因导致的呢?这里为大家整理一下,请对比自己的代码参考!
整理一些简单技巧的集合,帮你提升 jQuery 技能,你可以直接拿来使用,下面内容包括:禁止右键点击、隐藏搜索文本框文字、隐藏搜索文本框文字、在新窗口中打开链接、检测浏览器...
jQuery提供了JS未能提供的动画效果,利用jQuery的动画效果,可以极大的简化JS动画部分的逻辑,包括:滑入滑出动画、淡入淡出动画、显示隐藏动画、停止动画、自定义动画
 在网页的实际应用中,需要根据不同的条件来改变元素的CSS样式,通过动态的给元素添加删除一个CSS类可以实现此功能,下面通过实例来介绍一下如何实现此种功能。
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!