Jquery数据缓存

参考:https://blog.csdn.net/aitangyong/article/details/50323561

http://www.cnblogs.com/dolphinX/p/3348582.html

$.data的使用

  通过这个API,可以在这个对象上附加一些属性以及读取属性。

    var el = document.getElementById('content');  
    $.data(el, 'name', 'aty');  
    console.log($.data(el, 'name')); // aty  

  对于要操作的对象,分成两类:DOM对象和其他JS对象。

  在JQ初始化时,会生成一个随机的字符串expando,生成方式如下:

expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" )

操作DOM对象

  附加的数据不直接添加到DOM对象上,因为对于IE9之前的浏览器,在移除DOM对象后,无法释放直接附加到DOM对象上的自定义对象。

  附加的数据存放在$.cache对象中。在DOM对象上建立一个键值对:expando->自增的uuid,$.cache[dom对应的uuid]->{ data:对应dom的数据对象}

var dom = document.getElementById("a");  
$.data(dom, 'name', 'aty');  
console.log(dom[jQuery.expando]); // 1  
console.log(jQuery.cache); // {1 : {data:{name:'aty'}}}  

操作其他JS对象

  和以上操作DOM不同,操作其他JS对象时(包括JQ对象:$(dom)),会直接在这个对象上创建 obj[expando]->{ data:附加的数据对象}

var hisObj = {};  
$.data(hisObj, 'name', 'him');  
console.log(hisObj[jQuery.expando].data.name);//him  

attr和prop的区别

  对于DOM对象,获取和设置数据有两种方式

  • property:如xx.id,或者可以自定义属性,如 
    t.customizedProp='customized prop';
  • attribute:dom.getAttribute(name) / dom.setAttribute(name,value),这种方式设置的值显示到dom节点上:
var t=document.getElementById('test');
t.setAttribute('class','active');
t.setAttribute('customizedAttr','customized');

// <div id="test" class="active" customizedattr="customized">123</div>

 

   这两种方式操作的数据存在一定的交集,不管通过哪种方式修改,都会互相影响:

t.id='test1';
console.log(t.getAttribute('id'));//test1

 

  在这个交集中,并不是所有的key都是一致的,如t.className对应t.getAttribute("class")。可以看出,以上这两种方式存取值容易导致混乱。

  在jQuery1.6之前,.attr()方法在获取一些attributes的时候使用了property值,这样会导致一些不一致的行为。

  在jQuery1.6中,.prop()方法仅提供获取property值的方式,而.attr()方法仅返回attributes。

 

posted @ 2018-05-16 09:25  HelloHello233  阅读(946)  评论(0编辑  收藏  举报