jQuery缓存数据——仿Map

       最近在工作中遇到了这样一个情景。有些数据是从后台读取的,但是我暂时不需要展示在页面上,那怎么办呀?——缓存呀。今天我就来分享一下我所了解的Jquery缓存数据的方法。


       首先分享1篇博文——《读jQuery之六(缓存数据)》,还有2个文档:Jquery中的.data()方法,以及jQuery.data()方法。通过这些资料,你应该就会对缓存数据有了一定的了解。具体的介绍文档里已经说的很清楚了,我要分享的是自己写的一些js方法。


       在JAVA开发中,我们需要缓存数据,一般都选择放在了Map中。就算是放在各种缓存框架,也基本上都是以Key/Value的方式存放起来的。既然现在要在页面上缓存数据,那么我们就模仿Map来实现缓存数据的功能吧。


       jQuery.data()是一个底层的方法,所以我们尽量使用.data()的方法来完成这个功能。方法说明如下:



       根据说明,进行存储数据。由于是做缓存的,属于页面全局所有的。所以元素就选择body。具体代码如下:

[javascript]  view plain copy
  1. var map = {  
  2.   
  3.   /** 
  4.    * 缓存数据 
  5.    * 如果当前key已缓存了值,则抛出existed异常 
  6.    */  
  7.   put : function(key,value,override) {  
  8.     if(!this.get(key)) {  
  9.       var arr = new Array();  
  10.       arr.push(value);  
  11.       $("body").data(key, arr);  
  12.     }else if(override){//覆盖  
  13.       this.update(key, value);  
  14.     }else{  
  15.       throw new Error(key + " existed");  
  16.     }  
  17.   },  
  18.     
  19.   /** 
  20.    * 更新缓存数据 
  21.    */  
  22.   update:function(key,value,idx,name){  
  23.     if(!this.get(key)) {  
  24.       throw new Error(key + " is non-existed");  
  25.     }else{  
  26.       var arr = this.get(key);  
  27.       if(idx || idx>=0){  
  28.         if(arr[idx] instanceof Array){//数组的话  
  29.           this.remove(key);  
  30.           this.put(key,value,true);  
  31.         }else if(arr[idx] instanceof Object){  
  32.           if(typeof(value)=='number'){  
  33.             eval("arr["+idx+"]."+name+"="+value);  
  34.           }else{  
  35.             eval("arr["+idx+"]."+name+"='"+value+"'");  
  36.           }  
  37.         }  
  38.       }else{  
  39.         this.remove(key);  
  40.         this.put(key,value,true);  
  41.       }  
  42.     }  
  43.   },  
  44.   
  45.   /** 
  46.    * 在同一个key中追加数据 
  47.    */          
  48.   append:function(key, value) {  
  49.     if(!this.get(key)) {  
  50.       var arr = new Array();  
  51.       arr.push(value);  
  52.       $("body").data(key, arr);  
  53.     }else{//覆盖  
  54.       var arr = this.get(key);  
  55.       arr.push(value);  
  56.       $("body").data(key, arr);  
  57.     }  
  58.   },  
  59.   
  60.   /** 
  61.    * 移除缓存 
  62.    * 如果当前key已缓存了值,则抛出non-existed异常 
  63.    */  
  64.   remove:function(key){  
  65.     if(this.get(key)) {  
  66.       $("body").removeData(key);  
  67.     }else{  
  68.       throw new Error(key + " is non-existed");  
  69.     }  
  70.   },  
  71.     
  72.   /** 
  73.    * 移除所有缓存数据 
  74.    */              
  75.   removeAll:function(){  
  76.     $("body").removeData();  
  77.   },  
  78.     
  79.   /** 
  80.    * 获取缓存数据 
  81.    */        
  82.   get:function(key) {  
  83.     return ($("body").data(key) ? $("body").data(key) : undefined);  
  84.   },  
  85.   
  86.   /** 
  87.    * 获取缓存数据数组,结果为数组类型 
  88.    */    
  89.   getArray:function(key){  
  90.     return $("body").data(key);  
  91.   },  
  92.   
  93.   /** 
  94.    * 获取所有缓存数据,结果为对象类型 
  95.    */      
  96.   getObject:function(){  
  97.     return $("body").data();  
  98.   }  
  99. }  

       这段代码采用了面向对象的思想,提供了get、update、append、remove等方法,并对方法进行了封装,足够满足你的需求。测试代码如下:

[html]  view plain copy
  1. <body>  
  2.   <textarea id="scripts" row="3" style="width:800px;height:540px">  
  3.     map.removeAll();//移除所有的缓存数据  
  4.     map.put("user","zhangsan");//添加缓存  
  5.     $("#result").text("姓名:" + map.get("user"));  
  6.     $("#wait").text("  [1秒后会更新该值]");  
  7.       
  8.     setTimeout(function (){  
  9.       $("#wait").text("");  
  10.       $("#result").text("");  
  11.       var user = {name:'lisi'};  
  12.       map.update("user",user);//更新缓存  
  13.       $("#result").text("姓名:"+map.get("user")[0].name);      
  14.         
  15.       $("#wait").text("  [1秒后会更新该值]");        
  16.       setTimeout(function(){  
  17.         $("#wait").text("");  
  18.         $("#result").text("");  
  19.         map.update("user",22,"age",0);//更新缓存  
  20.         map.update("user","xx市xx街xx号","addr",0);//更新缓存  
  21.         var user = map.get("user")[0];  
  22.         $("#result").text("姓名:"+user.name+' 年方:'+user.age+" 家住:"+user.addr);  
  23.         $("#wait").text("  [1秒后会更新该值]");  
  24.       },1000);  
  25.         
  26.         
  27.       setTimeout(function(){  
  28.         $("#wait").text("");  
  29.         $("#result").text("");  
  30.         var user2 = {name:'zhangsan'};  
  31.         map.append("user",user2);//追加缓存  
  32.         $("#result").text("姓名1:"+map.get("user")[0].name+' ,姓名2:'+map.get("user")[1].name);    
  33.         $("input").show();  
  34.       },2000);  
  35.       },1000);  
  36.   </textarea><br/><br/>  
  37.   执行结果:<span id="result" style="color:#ff0000"></span><span id="wait"></span><br/>  
  38.   ---------------------------------------------------<br/>  
  39.   预计结果:<br/>  
  40.    姓名:zhangsan<br/>  
  41.    姓名:lisi<br/>  
  42.    姓名:lisi 年方:22 家住:xx市xx街xx号<br/>  
  43.    姓名1:lisi ,姓名2:zhangsan   
  44.   <br/><br/><input type="button" onclick="eval($('#scripts').val());" value="运行测试">   
  45.   <input type="button" style="display:none;" onclick="alert(map.get('user')[0].name)" value="获取第一个缓存的name值">   
  46.   <input type="button" style="display:none;" onclick="alert(map.getArray('user').length)" value="获取缓存的数量">   
  47.   <input type="button" style="display:none;" onclick="alert(JSON.stringify(map.get('user')[0]))" value="获取第一个用户的详细信息">   
  48. </body>  

       点击这个可以在线查看运行结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值