JQuery源码阅读0=>prop同级

作者: 小遁哥 | 来源:发表于2018-04-14 20:11 被阅读13次

0

值接受函数的形势

$dnf.prop("checked",function(){
            
            return  true;
        });

不传值则意味着取值

  $dnf.prop("checked");

在Jquery中几乎是通用的

1

jQuery.fn.extend

对Jq封装的DOM元素可使用方法、属性的扩展

jQuery.extend

可以直接使用$调用

可以在源码中所搜这两个关键字,你会看到很多熟悉的名字,而每一个jQuery.fn.extend几乎都对应着一个jQuery.extend,这属于封装的层层抽调。

比如 $.prop( elem, name, value)

2

test.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="test.js"></script>
    <script src="js/jquery-3.3.1.js"></script>
</head>
<body>
    
    <input type="checkbox" id="dnf">
        
</body> 
</html>

test.js

    window.onload = function(){
        var $dnf = $("#dnf");
        debugger
        $dnf.prop("checked",true);
    }

prop的取值类似于$dnf[0]['checked']
赋值类似于$dnf[0]['checked'] = true

让我们看看源码

function( elem, name, value ) {
    var ret, hooks,
        nType = elem.nodeType;
    //nType 存储节点类型  不处理文本、注释、和属性节点,在我看来这个判断有些多余,如果它发出警告似乎更有意义 
    if ( nType === 3 || nType === 8 || nType === 2 ) {
        return;
    }
            //当不是元素节点或者不是xml文档时
    if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {

        //propFix和prop在同一扩展里  用于映射些特殊的属性名
    
        name = jQuery.propFix[ name ] || name;
       //propHooks和prop在同一扩展里  用于获取和设置特殊的属性值
        hooks = jQuery.propHooks[ name ];
    }

    if ( value !== undefined ) {
            //赋值
        if ( hooks && "set" in hooks &&
            ( ret = hooks.set( elem, value, name ) ) !== undefined ) {                        
                            //特殊属性赋值              
            return ret;
        }
                    /*简单属性赋值  已下为一种简写方式 相当于
                          elem[ name ] = value;
                           return elem[ name ];注意这里和返回value是有区别的

                    */
        return ( elem[ name ] = value );
    }

    if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
          //特殊取值
        return ret;
    }
            //普通取值
    return elem[ name ];
},

上述的编码逻辑我有些看法,取值赋值、特殊取值和非特殊取值是互斥关系的,因该用if else这种方式区分开。

显然,jquery采用了复杂=>简易的方式,符合逻辑就中断后续的处理,在我看来,这样并不友好,倒是可以尝试!

propFix

初始化后propFix有两种类型的映射

"for": "htmlFor",
"class": "className"

cellpadding:"cellPadding"

Jq还挺贴心的

propHooks

只对tabindex值的获取做了特殊处理。
这里要称赞Jq的封装艺术了,可以从prop源码中看到,作者并没有因为上述原因就忽略该有的流程。

  propHooks: {
        tabIndex: {
            get: function( elem ) {

                // Support: IE <=9 - 11 only
                // elem.tabIndex doesn't always return the
                // correct value when it hasn't been explicitly set
                // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
                // Use proper attribute retrieval(#12072)
                                 //当没有设置值时,tabindex并不能返回正确的值

                                //通过getAttribute查找
                var tabindex = jQuery.find.attr( elem, "tabindex" );

                if ( tabindex ) {
                                            //将tabindex转换为10进制数
                    return parseInt( tabindex, 10 );
                }

                if (
                   //rfocusable  是一个用于检测是否是能获得焦点元素的正则表达式    rclickable是一个检测是否是能点击元素的正则表达式
                    rfocusable.test( elem.nodeName ) ||
                    rclickable.test( elem.nodeName ) &&
                    elem.href
                ) {
                    return 0;
                }

                return -1;
            }
        }
    }

相关文章

网友评论

    本文标题:JQuery源码阅读0=>prop同级

    本文链接:https://www.haomeiwen.com/subject/pzvlkftx.html