jQuery緩存操作-cache數(shù)據(jù)

jQuery從1.2.3開始提供了data/removeData方法用來存儲(chǔ)/刪除數(shù)據(jù)。1.6.1代碼片段

jQuery.extend({
    cache: {},
 
    // Please use with caution
    uuid: 0,
     
    ...
     
});

即給jQuery添加了靜態(tài)字段/方法,有jQuery.cache/jQuery.uuid/jQuery.expando等。下面分別介紹


jQuery.cache 空對象,用來緩存。它的結(jié)構(gòu)較復(fù)雜。


jQuery.uuid 自增唯一的數(shù)字。


jQuery.expando 字符串,使用Math.random生成,去掉了非數(shù)字字符。它作為HTMLElement或JS對象的屬性名。
    
expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),


jQuery.noData JS對象,對于指定的HTMLElement禁用data方法。如embed、applet。


jQuery.hasData 用來判斷HTMLElement或JS對象是否具有數(shù)據(jù)。返回true或false。即如果調(diào)用了jQuery.data方法添加了屬性,則返回true。

<div>aa</div>
<script>
    var div = document.getElementsByTagName('div')[0];
    $.hasData(div); // false
    $.data(div, 'name','jack');
    $.hasData(div); // true
</script>

jQuery.acceptData 用來判斷該元素是否能接受數(shù)據(jù),返回true或false。在jQuery.data中使用。

jQuery.data 這是提供給客戶端程序員使用的方法,它同時(shí)是setter/getter。

1,傳一個(gè)參數(shù),返回附加在指定元素的所有數(shù)據(jù),即thisCachejQuery.data(el); // thisCache

2,傳二個(gè)參數(shù),返回指定的屬性值jQuery.data(el, 'name');

3,傳三個(gè)參數(shù),設(shè)置屬性及屬性值jQuery.data(el, 'name', 'jack');jQuery.data(el, 'uu', {});
4,傳四個(gè)參數(shù),第四個(gè)參數(shù)pvt僅提供給jQuery庫自身使用。即jQuery._data方法中傳true。因?yàn)閖Query的事件模塊嚴(yán)重依賴于jQuery.data,為避免人為的不小心重寫在這個(gè)版本中加入的。

jQuery.removeData 刪除數(shù)據(jù)。

上面是jQuery數(shù)據(jù)緩存模塊的整體概述,下面詳細(xì)說下jQuery.data方法。jQuery.data為兩種對象提供緩存:JS對象和HTMLElement
    
// 為JS對象提供緩存
var myObj = {};
$.data(myObj, 'name', 'jack');
$.data(myObj, 'name'); // jack
 
// 為HTMLElement提供緩存
<div id="xx"></div>
<script>
    var el = document.getElementById('xx');
    $.data(el, 'name', 'jack');
    $.data(el, 'name'); // jack
</script>

內(nèi)部實(shí)現(xiàn)上也是有區(qū)別的,


1,為JS對象提供緩存時(shí),直接將數(shù)據(jù)保存在JS對象上。cache為JS對象。此時(shí)會(huì)偷偷的給JS對象添加個(gè)屬性(類似于jQuery16101803968874529044),屬性值也是個(gè)JS對象。舉例說明

var myObj = {};
$.data(myObj, 'name', 'jack');
console.log(myObj);

myObj的結(jié)構(gòu)如下
myObj = {
    jQuery16101803968874553435 : {
        name : 'jack'
    }
}


jQuery16101803968874553435 這個(gè)字符串在data內(nèi)部命名為id(注意并非HTMLElement元素的id),它實(shí)際就是jQuery.expando。上面已經(jīng)提到它是在jQuery.js引入到頁面后隨機(jī)生成的。

2,為HTMLElement提供緩存時(shí),卻不會(huì)直接保存在HTMLElement上。而是保存在jQuery.cache上。cache為jQuery.cache。此時(shí)先給HTMLElement添加屬性(類似于jQuery16101803968874529044),屬性值為數(shù)字(1,2,3遞增)。即只將一些數(shù)字保存在了HTMLElement上,不會(huì)直接將數(shù)據(jù)置入。這是因?yàn)镮E老版本中可能會(huì)存在內(nèi)存泄露危險(xiǎn)。而HTMLElement如何與jQuery.cache建立聯(lián)系呢? 還是id。剛剛提到屬性值數(shù)字就是id。舉例說明
<div id="xx"></div>
<script>
    var el = document.getElementById('xx');
    $.data(el, 'name', 'jack');
    console.log(el[jQuery.expando]); // 1
    console.log(jQuery.cache); // {1 : {name:'jack'}}
</script>

el 上添加了屬性jQuery.expando,值為id,這個(gè)id是從1開始遞增的。而id又作為jQuery.cache的屬性(key)。這樣就HTMLElement就與jQuery.cache建立了聯(lián)系。如圖


創(chuàng)新互聯(lián)是網(wǎng)站建設(shè)技術(shù)企業(yè),為成都企業(yè)提供專業(yè)的成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、成都外貿(mào)網(wǎng)站建設(shè)公司,網(wǎng)站設(shè)計(jì),網(wǎng)站制作,網(wǎng)站改版等技術(shù)服務(wù)。擁有十多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制適合企業(yè)的網(wǎng)站。十多年品質(zhì),值得信賴!

jQuery緩存操作-cache數(shù)據(jù)




不知注意到?jīng)]有,jQuery.data還有第四個(gè)參數(shù)pvt,這個(gè)參數(shù)只在jQuery._data中使用。
// For internal use only.
_data: function( elem, name, data ) {
    return jQuery.data( elem, name, data, true );
},

jQuery._data從命名上就指定它是私有的,使用jQuery的客戶端程序員不應(yīng)該去調(diào)用該方法。jQuery的API文檔上也不會(huì)公開它。


jQuery的數(shù)據(jù)緩存模塊從1.2.3到1.6.1幾乎每個(gè)版本都在變。jQuery._data的提出就是為了避免客戶端程序員覆蓋/重寫了默寫模塊。如jQuery事件模塊中事件handler等就使用jQuery.data存儲(chǔ),如果重寫了該模塊。那么事件模塊將癱瘓。因此特意添加了pvt參數(shù)及jQuery._data方法。


但如果你刻意要破壞,那么還是可以做的。如下

<div id="xx">Test</div>
<script>
    $('#xx').click(function(){
        alert('click');
    });
     
    // 語句1
    $.data($('#xx')[0], 'events', '', true);
     
    // 語句2
    //$._data($('#xx')[0], 'events', '');
</script>

點(diǎn)擊div[id=xx]將不會(huì)觸發(fā)點(diǎn)擊事件。

標(biāo)題名稱:jQuery緩存操作-cache數(shù)據(jù)
URL鏈接:http://muchs.cn/article16/gesodg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計(jì)、網(wǎng)站設(shè)計(jì)移動(dòng)網(wǎng)站建設(shè)、面包屑導(dǎo)航、外貿(mào)網(wǎng)站建設(shè)、企業(yè)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化