亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

jQuery的緩存機制淺析

2019-11-20 14:45:41
字體:
來源:轉載
供稿:網友

前不久在研究jQuery的動畫隊列的時候,發現jQuery的緩存系統也很強大,盡管以前也稍微接觸過,但一直都沒有深入研究過。jQuery的緩存系統在外部應用的時候都比較簡單,比如要將某個URL數據存到緩存中只要這么寫:

復制代碼 代碼如下:

var val = "stylechen.com";
$("div").data( "url" ); // 返回undefined
$("div").data( "url", val ); // 返回"stylechen.com"
$("div").data( "url" ); // 返回"stylechen.com"

不光可以存儲字符串,上面的val也可以是任意數據,對象、數組、函數等都可以存到里面。僅僅實現這種功能還是挺簡單的,聲明一個全局對象用來存儲數據,然后使用data方法來存儲或返回數據:

復制代碼 代碼如下:

var cacheData = {}; // 用來存儲數據的全局對象
var data = function( key, val ){
 if( val !== undefined ){
  cacheData[key] = val;
 }

 return cacheData[key];
}; 

jQuery緩存系統的真正魅力在于其內部應用中,動畫、事件等都有用到這個緩存系統。之前在寫easyAnim的時候,我將動畫的隊列都存儲到各DOM元素的自定義屬性中,這樣雖然可以方便的訪問隊列數據,但也同時帶來了隱患。如果給DOM元素添加自定義的屬性和過多的數據可能會引起內存泄漏,所以要盡量避免這么干。

如果是使用jQuery的緩存系統來存放DOM元素的數據,會先給該DOM元素添加一個隨機生成的屬性,這個屬性用來存放訪問緩存數據的索引值,就好比DOM元素都有一把開啟緩存保險箱的鑰匙,只要有了鑰匙就可以隨時開啟緩存保險箱。將本來存放到DOM元素中的數據都轉到了緩存中,而DOM元素本身只要存儲一個簡單的屬性就可以了,這樣就可以將由DOM元素引起的內存泄漏的風險規避到最小。下面是我模擬jQuery自己寫的一個簡單的緩存系統:

復制代碼 代碼如下:

var cacheData = {}, // 用來存儲數據的全局對象
 uuid = 0,
 // 聲明隨機數
 expando = "cacheData" ( new Date() "" ).slice( -8 );

var data = function( key, val, data ){
 if( typeof key === "string" ){
  if( val !== undefined ){
   cacheData[key] = val;
  }

  return cacheData[key];
 }
 else if( typeof key === "object" ){
  var index,
   thisCache;

  if( !key[expando] ){
   // 添加一個DOM元素的屬性
   // 隨機數是屬性名 索引值是屬性值
   index = key[expando] = uuid;
   thisCache = cacheData[index] = {};
  }
  else{
   index = key[expando];
   thisCache = cacheData[index];
  }

  
  if( !thisCache[expando] ){
   thisCache[expando] = {};
  }

  if( <a >gambling</a> data !== undefined ){
   // 將數據存到緩存對象中
   thisCache[expando][val] = data;
  }

  // 返回DOM元素存儲的數據
  return thisCache[expando][val];
 }
};

var removeData = function( key, val ){
 if( typeof key === "string" ){
  delete cacheData[key];
 }
 else if( typeof key === "object" ){
  if( !key[expando] ){
   return;
  }
  // 檢測對象是否為空
  var isEmptyObject = function( obj ) {
    var name;
    for ( name in obj ) {
     return false;
    }
    return true;
   },

   removeAttr = function(){
    try{
     // IE8及標準瀏覽器可以直接使用delete來刪除屬性
     delete key[expando];
    }
    catch (e) {
     // IE6/IE7使用removeAttribute方法來刪除屬性
     key.removeAttribute(expando);
    }
   },

   index = key[expando];

  if( val ){
   // 只刪除指定的數據
   delete cacheData[index][expando][val];
   // 如果是空對象 索性全部刪除
   if( isEmptyObject( cacheData[index][expando] ) ){
    delete cacheData[index];
    removeAttr();
   }
  }
  else{
   // 刪除DOM元素存到緩存中的所有數據
   delete cacheData[index];
   removeAttr();
  }
 }
};


上面的代碼值得注意的是IE6/IE7中用delete來刪除自定義的屬性會報錯,只能使用removeAttribute來刪除,標準的瀏覽器都可以使用delete來刪除。下面是調用的結果:

復制代碼 代碼如下:

var box = document.getElementById( "box" ),
 list = document.getElementById( "list" );

data( box, "myName", "chen" );
alert( data( box, "myName" ) ); // chen

data( box, "myBlog", "stylechen.com" );
alert( data( box, "myBlog" ) ); // stylechen.com

removeData( box, "myBlog" );

alert( data( box, "myBlog" ) ); // undefined
alert( data( box, "myName" ) ); // chen
alert( box[expando] ); // 1

removeData( box );
alert( box[expando] ); // undefined

當然,jQuery的緩存系統比我的這個要復雜些,不過核心原理還是一樣的。easyAnim將會在后續的版本中引入這個緩存系統。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产欧美va欧美va香蕉在线| 国产精品91久久| 91香蕉亚洲精品| 久久久久久久电影一区| 亚洲在线观看视频网站| 欧美肥臀大乳一区二区免费视频| 高跟丝袜欧美一区| 日本精品视频在线观看| 国产精品91视频| 日韩在线播放视频| 97视频在线观看播放| 亚洲一区美女视频在线观看免费| 欧美国产日韩一区二区| 国产精品第七十二页| 亚洲国产一区二区三区在线观看| 成人伊人精品色xxxx视频| 成人久久一区二区| 国产精品久久久久久久久久三级| 精品国产一区二区三区久久久狼| 国产精品va在线播放我和闺蜜| 久久久精品一区二区三区| 日韩欧美国产视频| 久久久久久亚洲精品中文字幕| 国产欧美日韩丝袜精品一区| 一区二区三区视频免费| 欧美日韩精品国产| 午夜精品久久久久久久99黑人| 成人网在线免费观看| 精品国产成人在线| 日韩成人中文字幕在线观看| 亚洲视频在线免费观看| 永久免费精品影视网站| 一个人www欧美| 亚洲娇小xxxx欧美娇小| 精品露脸国产偷人在视频| 九九热这里只有精品免费看| 中文字幕欧美日韩| 在线视频一区二区| 欧洲一区二区视频| 国产一区二区美女视频| 久久久久女教师免费一区| 欧美成人免费在线观看| 亚洲xxxxx| 亚洲第一综合天堂另类专| 成人网欧美在线视频| 成人免费视频xnxx.com| 欧美成人精品一区| 久久精品视频亚洲| 秋霞成人午夜鲁丝一区二区三区| 亚洲电影免费观看高清| 日韩精品免费视频| 国产精品国语对白| 精品久久久久久电影| 亚洲精品美女在线观看播放| 久久久久999| 不卡伊人av在线播放| 亚洲精品动漫久久久久| 九九热精品视频国产| 亚洲欧美在线x视频| 91免费欧美精品| 欧美性猛交xxx| 日韩在线欧美在线| 亚洲福利在线视频| 国产一区二区三区日韩欧美| 亚洲最大的网站| 成人做爰www免费看视频网站| 91av在线精品| 国产精品影院在线观看| 91精品国产色综合久久不卡98| 欧美大尺度电影在线观看| 韩国一区二区电影| 色青青草原桃花久久综合| 久久久www成人免费精品张筱雨| 日韩最新在线视频| 精品国内产的精品视频在线观看| 亚洲激情在线视频| 91网站免费观看| 久久人人爽人人爽人人片av高清| 亚洲美女福利视频网站| 亚洲九九九在线观看| 亚洲女人被黑人巨大进入al| 欧美丰满少妇xxxxx做受| 久久久久女教师免费一区| 欧美一级高清免费| 亚洲成色777777女色窝| 国语对白做受69| 国产精品视频专区| 国产91精品久久久久久| 欧美黑人一区二区三区| 欧美一级视频免费在线观看| 国产精品www网站| 日韩中文字幕欧美| 国产日韩在线视频| 亚洲色在线视频| 久久中文久久字幕| 日韩专区中文字幕| 91日本在线视频| 亚洲毛茸茸少妇高潮呻吟| 成人黄色在线播放| 国产精品福利观看| 91精品久久久久久久久中文字幕| 亚洲一区二区日本| 久久精品国产69国产精品亚洲| 色综合91久久精品中文字幕| 国产精品视频最多的网站| 免费99精品国产自在在线| 日韩av一区在线| 日韩一级裸体免费视频| 亚洲精品一区二区三区不| 国产精品美女网站| 国产婷婷成人久久av免费高清| 成人欧美一区二区三区在线湿哒哒| 午夜精品久久久久久久99黑人| 精品一区精品二区| 亚洲性视频网址| 91精品中国老女人| 国精产品一区一区三区有限在线| 欧美日韩色婷婷| 亚洲激情自拍图| 国产日韩精品综合网站| 国产成人精品一区二区三区| 国产精品视频最多的网站| 欧美激情精品在线| 国产香蕉97碰碰久久人人| 91精品国产色综合久久不卡98| 日韩精品中文字幕久久臀| 日韩美女激情视频| 伊人伊人伊人久久| 亚洲欧美中文日韩在线| 久久久国产精品x99av| 国产精品女视频| 久久精品国产免费观看| 中文字幕欧美国内| 亚洲精品视频中文字幕| 成人444kkkk在线观看| 亚州精品天堂中文字幕| 久久久精品影院| 国产午夜精品视频免费不卡69堂| 国产在线观看精品一区二区三区| 精品欧美一区二区三区| 亚洲jizzjizz日本少妇| 久久精品99久久久香蕉| 2019国产精品自在线拍国产不卡| 亚洲网站视频福利| 欧美最猛性xxxxx(亚洲精品)| 亚洲男女自偷自拍图片另类| 欧洲成人免费aa| 九九精品视频在线| 日韩av在线网页| 国产精品av免费在线观看| 久久天天躁狠狠躁夜夜躁| 欧洲亚洲女同hd| 亚洲国产精品va在看黑人| 国产精品久久久久久亚洲调教| 日本老师69xxx| 国产精品视频白浆免费视频| 欧美噜噜久久久xxx| 亚洲国产97在线精品一区| 亚洲天堂男人的天堂| 91伊人影院在线播放| 国产精品美女无圣光视频| 俺去亚洲欧洲欧美日韩| 色狠狠av一区二区三区香蕉蜜桃| 国产精品免费久久久|