好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

mass Framework data模块 v3

mass Framework data模块 v3

mass Framework data模块 v3

这是吸收jquery2.0的新技术,通过节点在数组中的索引值来关联目标与缓存体。这就有效避开了IE下某些节点不能添加自定义属性的问题,也在es5中新增的Object.preventExtensions方法下得以生存。

View Code //==================================================

// 数据缓存模块

//==================================================

define( "data" , [ "$lang" ], function ( $ ){

     function   Data(user) {

         this .owners = [];

         this .user = user;

         this .cache = [];

     }

     Data.prototype = {

         add: function ( owner ) {

             var   index = this .owners.push( owner );

             return   ( this .cache[ index - 1 ] = {});

         },

         access: function ( owner, key, value ) {

             var   index = this .owners.indexOf( owner );

             var   cache = index === -1 ?  this .add( owner ) : this .cache[ index ];

             if ( typeof   key == "string" ){

                 if (value == undefined){ //读方法

                     //对于用HTML5 data-*属性保存的数据, 如<input id="test" data-full-name="Planet Earth"/>

                     //我们可以通过$("#test").data("full-name")或$("#test").data("fullName")访问到

                     if ( this .user && !(key in   cache) && owner && owner.nodeType == 1 ){

                         $.parseData( owner, key, cache );

                     }

                     return   cache[key];

                 } else {

                     return   cache[key] = value; //写方法

                 }

             }

             return   key && typeof   key == "object"   ?  $.mix(cache, value) : cache;

         },

         remove: function ( owner, key ) {

             var   name,

             camel = $.String.camelize,

             index = this .owners.indexOf( owner ),

             cache = this .cache[ index ];

             if   ( key === undefined ) {

                 cache = {};

             } else   {

                 if   ( cache ) { //如果已经存在

                     if   ( !Array.isArray( key ) ) { //如果不是数组

                         if   ( key in   cache ) {

                             name = [ key ];

                         } else   { //尝试驼峰化再求,再不行数组化

                             name = camel( key );

                             name = name in   cache ? [ name ] : name.match($.rword);

                         }

                     } else   { //如果是数组

                         name = key.concat( key.map( camel ) );

                     }

                     for   ( var   i =0, l = name.length ; i < l; i++ ) {

                         delete   cache[ name[i] ];

                     }

                 }

             }

             this .cache[ index ] = cache;

         },

         hasData: function ( owner ) {

             var   index = this .owners.indexOf( owner );

             if   ( index > -1 ) {

                 return   !$.isEmptyObject( this .cache[ index ] );

             }

             return   false ;

         }

     };

     var   user = new   Data( true ), priv = new   Data;

     $.mix( {

         data: function ( elem, name, data ) {

             return   user.access( elem, name, data );

         },

         removeData: function ( elem, name ) {

             return   user.remove( elem, name );

         },

         _data: function ( elem, name, data ) {

             return   priv.access( elem, name, data );

         },

         _removeData: function ( elem, name ) {

             return   priv.remove( elem, name );

         },

         hasData: function ( elem ) {

             return   user.hasData( elem ) || priv.hasData( elem );

         },

         parseData: function (target, name, cache, value){

             var   data, key = $.String.camelize(name),_eval

             if (cache && (key in   cache))

                 return   cache[key];

             if (arguments.length != 4){

                 var   attr = "data-"   + name.replace( /([A-Z])/g, "-$1"   ).toLowerCase();

                 value = target.getAttribute( attr );

             }

             if   ( typeof   value === "string" ) { //转换 /^(?:\{.*\}|null|false|true|NaN)$/

                 if (/^(?:\{.*\}|\[.*\]| null | false | true |NaN)$/.test(value) || +value + ""   === value){

                     _eval = true

                 }

                 try   {

                     data = _eval ?  eval( "0," + value ) : value

                 } catch ( e ) {

                     data = value

                 }

                 if (cache){

                     cache[ key ] = data

                 }

             }

             return   data;

 

         },

         //合并数据

         mergeData: function ( cur, src){

             if ( priv.hasData(src) ){

                 var   oldData  = priv.access(src), curData = priv.access(cur), events = oldData .events;

                 $.Object.merge( curData , oldData  );

                 if (events){

                     curData.events = [];

                     for   ( var   i = 0, item ; item =  events[i++]; ) {

                         $.event.bind( cur, item );

                     }

                 }

             }

             if ( user.hasData(src) ){

                 oldData = user.access(src)

                 curData = user.access(cur)

                 $.Object.merge( curData , oldData  );

             }

         }

     });

     return   $

});

不能不感概jQuery团队的奇思妙想。但这个新方案也不尽完美,它以是四个不断膨胀的数组为代码实现的,估计得结合1.8中昙花一现的deleteIds技术才能解决这问题。

 

 

标签:  javascript ,  mass

作者: Leo_wl

    

出处: http://HdhCmsTestcnblogs测试数据/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于mass Framework data模块 v3的详细内容...

  阅读:43次