• jQuery access()方法


    最开始只是想了解attr方法,发现它内部调用了jQuery.access()方法。除了attr,还有prop、texthtmlcssdata 都是内部调用了jQuery.access()方法,可见它的重要。

        attr: function( name, value ) {
            return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
        }
        prop: function( name, value ) {
            return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
        }
        text: function( value ) {
            return jQuery.access( this, function( value ) {
                //code
            }, null, value, arguments.length );
        }
        html: function( value ) {
            return jQuery.access( this, function( value ) {
               //code
            }, null, value, arguments.length );
        }
        css: function( name, value ) {
            return jQuery.access( this, function( elem, name, value ) {
          //code
            }, name, value, arguments.length > 1 );
        }
        data: function( key, value ) {
        //code
            return jQuery.access( this, function( value ) {
            //code
            }, null, value, arguments.length > 1, null, true );
        }

    源码分析:

        access: function( elems, fn, key, value, chainable, emptyGet, raw ) {
            var i = 0,
                length = elems.length,//jquery对象的长度
                bulk = key == null;//false
    
            // Sets many values
            if ( jQuery.type( key ) === "object" ) {//键值对方式赋值
                chainable = true;//链式
                for ( i in key ) {//遍历递归调用自身
                    jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
                }
    
            // Sets one value
            } else if ( value !== undefined ) {//单赋值
                chainable = true;//链式
                //这种情况也是赋值 如.attr( attributeName, function(index, attr) )传入的value就是一个函数
                if ( !jQuery.isFunction( value ) ) {//如果第四个参数不是函数,raw为true
                    raw = true;
                }
    
                if ( bulk ) {//key为null或者undefined时
                    // Bulk operations run against the entire set
                    if ( raw ) {
                        fn.call( elems, value );//不知道这种情况什么时候出现
                        fn = null;
    
                    // ...except when executing function values
                    } else {
                        bulk = fn;
                        fn = function( elem, key, value ) {
                            return bulk.call( jQuery( elem ), value );
                        };
                    }
                }
    
                if ( fn ) {//如果第二个参数函数存在
                    for ( ; i < length; i++ ) {//对jquery数组中的每一个元素调用回调
                        //如果value不是函数 fn(elems[i], key,value);
                        //如果value是函数:fn(elems[i], key,value.call( elems[i], i, fn( elems[i], key )));
                        fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
                    }
                }
            }
    
            return chainable ? //如果是链式
                elems : //返回jquery对象
    
                // Gets 不是链式,是获取值
                bulk ? //key为undefined或者null
                    fn.call( elems ) :
                    length ? fn( elems[0], key ) : emptyGet; //如果jquery对象有长度,获取对象第一个元素的键值,没长度,返回emptyGet
        }

    目前的疑问:

    1、什么情况下key的值为null和undefined

    to be continue...

  • 相关阅读:
    Android学习第九天
    Android短信备份及插入笔记
    内容提供者实现应用访问另一个应用的数据库
    Verilog语言实现1/2分频
    QT中一个界面向另一个界面发送信号
    CMAKE设置Windows SDK编译版本
    VS2017下载地址
    VS 设置Windows SDK版本
    OBS 64bit版本编译
    Qt打包程序无法运行,提示应用程序无法正常启动0xc000007b解决办法
  • 原文地址:https://www.cnblogs.com/qianlegeqian/p/4117489.html
Copyright © 2020-2023  润新知