jQuery 之缓存

  • Post author:
  • Post category:其他




1.前言


在后台中,某栏目添加多个单品,输入单片链接之后需要进行ajax请求该单品的详细数据,点击“保存”按钮,需要将所有的单品数据进行汇总为json并保存。


给文本框的blur添加事件进行ajax请求后数据的存储成为一个问题,偶然看jquery源码时,发现.data是一个不错的实现。



2.使用


jQuery.data可以为普通对象或是DOM element 附加及获取数据,分为以下三类:


1)用name,value给普通对象赋值   $.data(obj,name,value),获取数据$.data(obj,name)


2)用另一个对象给普通对象赋值    $.data(obj,another), 获取数据$.data(obj,name)


3)给DOM element元素赋值   $.data(element,name,value) ,获取数据$.data(element,name)



3.详细


1》给普通对象赋值解析


给对象赋值时,其实就是将一个“cache”附加到了对象上,并使用了一个特殊的属性名称





如上图所示:obj多了一个属性名:jQuery112100953224126715213 在该属性下存放了数据。


属性名的生成:var expando=”jQuery”+(“1.2″+Mah.random()).replace(/\D/g,”);  //jquery版本加随机数,特殊名称,并用于标识不同的页面,它是jQuery引入到页面后随即生成的。


2》给DOM element元素赋值


因为在一些浏览器中(IE6,7)不能有效回收DOM element上附加的对象引用,所以采用不同的方式来附加数据


使用了cache,并附加uid(唯一且递增),不直接保存在DOM element上,保存于jQuery.cache上。uid附加在



DOM Element 的 “expando” 属性中。



var


id = obj[expando] = obj[expando] || ++uuid;






另,有的Dom element具有其他的“事件”之类的。为防止被用户覆盖不能使用,缓存附加的属性不在jQuery164….该属性的下面。与其实兄弟平级。




如果想覆盖也是可以的,

$.data中第四个参数为true(默认为false)此时修改的是expando内部的events







4.简单实现


查了一下有网友对这部分内容的简单实现,敲了一下,附上代码:


$=function(){
	var globleCache={};
	var expando=jQuery+("1.6"+Math.random()).replace(/\D/,'');  //过滤非数字
	var uuid=0;
	function getcache(obj){  //根据对象的不同选择不同的存储位置
		if(obj.nodeType){  //DOM element 
			var id=obj[expando]=obj[expando]||++uuid;  //uuid 自增
			globleCache[id]=globleCache[id]||{};
			return globleCache[id];
		}else{
			obj[expando]=obj[expando]||{};
			return obj[expando];
		}
	}
	function getdata(cache,name){  //获取缓存值
                 return cache[name];
	}
	function setdata(cache,name,value){   //插入缓存值
		return cache[name]=value;
	}
	function setdatawithobject(cache,another){  //将对象向对象赋值
              for(var name in another){
        	cache[name]=another[name];
              }
	}
	return{
		data:function(obj,name,value){
			var cache=getcache(obj);
			if(name instanceof Object){  //值为另一个对象
                                setdatawithobject(cache,name);
			}else if(value===undefined){
				getdata(cache,name);
			}else{
				setdata(cache,name,value);
			}
		}
	}
   
}



版权声明:本文为yimi34原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。