jQuery源码解析data

jQuery.fn.extend({
    data:function(key,value){
        //解析html5的自定义属性 data-*
    }
})
1. .data(key,value)
      如果传递的参数是key和value,则是为每个匹配元素设置任意类型的数据
2 .data(key)
如果只传入参数key,则返回第一个匹配元素的指定名称的数据
 var $div = $("div");
 $div.data("name","111");
 console.log($div.data("name"));
3. .data()
如果未传入任何参数的话,则返回第一个匹配元素关联的自定义数据缓存对象,包含html5属性data-中的数据
4.  .data(obj)
如果传入的是含有的键值对的对象的话,则为每个匹配的元素批量设置数据.
/*
@ param attrs 保存元素的所有属性
@ param name  保存元素的属性名
@ param elem  获取第一个元素
*/
jQuery.fn.extend({
        data: function( key, value ) {
            var attrs, name,
                elem = this[0],
                i = 0,
                data = null;

            // Gets all values
            /*如果未传入参数的话,则返回第一个匹配元素关联的自定义数据对象*/
            if ( key === undefined ) {
                if ( this.length ) {
                /*获取匹配的第一个元素关联的自定义数据缓存对象*/
                    data = jQuery.data( elem );
                /**该元素是元素节点的话,则获取该元素的所有自定义属性,进行for循环遍历/
                    if ( elem.nodeType === 1 &&!jQuery._data( elem, "parsedAttrs" ) ) {
                        attrs = elem.attributes;
                        for ( ; i < attrs.length; i++ ) {
                            name = attrs[i].name;
                            if ( !name.indexOf( "data-" ){
                            /*截取以data- 开头的后面的name属性名*/
                                name = jQuery.camelCase( name.slice(5) );
                                /*解析html5属性中的data- 中含有的数据,并把解析结果放入dom元素关联的自定义数据对象的缓存当中*/
                                dataAttr( elem, name, data[ name ] );
                            }
                        }
                        /*过滤已经解析过的数据*/
                        jQuery._data( elem, "parsedAttrs", true );
                    }
                }

                return data;
            }

            // Sets multiple values
            /*如果参数key是对象的话,则为匹配的元素批量设置数据*/
            if ( typeof key === "object" ) {
                return this.each(function() {
                    jQuery.data( this, key );
                });
            }

            return jQuery.access( this, function( value ) {
            /*如果只传入参数key,则返回第一个匹配元素的指定名称的数据*/
                if ( value === undefined ) {
                    // Try to fetch any internally stored data first
                    return elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : null;
                }
                /*如果传入的参数是key和value的话,则为每个匹配的元素设置数据*/
                this.each(function() {
                    jQuery.data( this, key, value );
                });
            }, null, value, arguments.length > 1, null, true );
        }
     });
/*全局匹配26个大写字母*/
var rmultiDash = /([A-Z])/g;
var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
/*
@ param elem 待解析的html5中的属性data-的DOM元素
@ param key 表示待解析的数据名;不包含data-
@ param data 从DOM元素关联的自定义数据缓存对象中取到的数据;
*/
   function dataAttr( elem, key, data ) {
       // 参数data为undefined的话,且是DOM元素节点的话,尝试从html5中含有data-中去解析数据
       if ( data === undefined && elem.nodeType === 1 ) {
        /*加前缀data- 并把可能的驼峰形式参数name转换为连字字符*/
           var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
           /*获取该属性值*/
           data = elem.getAttribute( name );
           /*如果data有返回值的话,如果是字符串的话,则尝试把字符串转换为javascript对象; 否则的话,直接给data赋值undefined,最后返回
   该data属性*/
           if ( typeof data === "string" ) {
               try {
                   data = data === "true" ? true :
                       data === "false" ? false :
                       data === "null" ? null :
                       // Only convert to a number if it doesn't change the string
                       +data + "" === data ? +data :
                       rbrace.test( data ) ? jQuery.parseJSON( data ) :
                           data;
               } catch( e ) {}

               // Make sure we set the data so it isn't changed later
               jQuery.data( elem, key, data );

           } else {
               data = undefined;
           }
       }

       return data;
   }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值