国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 編程 > JavaScript > 正文

jQuery數據緩存功能的實現思路及簡單模擬

2019-11-20 22:41:11
字體:
來源:轉載
供稿:網友
前言
對于jQuery的數據緩存,相信大家都不會陌生,jQuery緩存系統不僅運用于DOM元素,動畫、事件等都有用到這個緩存系統。所以在平時實際應用中, 我們經常需要給元素緩存一些數據,并且這些數據往往和DOM元素緊密相關。由于DOM元素(節點)也是對象, 所以我們可以直接擴展DOM元素的屬性,但是如果給DOM元素添加自定義的屬性和過多的數據可能會引起內存泄漏,所以應該要盡量避免這樣做。 因此更好的解決方法是使用一種低耦合的方式讓DOM和緩存數據能夠聯系起來。

另外:對于jQuery.data和jQuery.removeData靜態方法、以及基于這兩個方法的原型擴展方法的介紹和用法就不多說了,可以查看官方API文檔。

實現思路
jQuery提供了一套靈活和強大的緩存方法:
(1)先在jQuery內部創建一個cache對象{}, 來保存緩存數據。 然后往需要進行緩存的DOM節點上擴展一個值為expando的屬性, 這里是”jQuery” + (new Date).getTime()。 注:expando的值等于”jQuery”+當前時間, 元素本身具有這種屬性的可能性很少,所以可以忽略沖突。
(2)接著把每個節點的dom[expando]的值都設為一個自增的變量id,保持全局唯一性。 這個id的值就作為cache的key用來關聯DOM節點和數據。也就是說cache[id]就取到了這個節點上的所有緩存,即id就好比是打開一個房間(DOM節點)的鑰匙。 而每個元素的所有緩存都被放到了一個map映射里面,這樣可以同時緩存多個數據。
(3)所以cache對象結構應該像下面這樣:
復制代碼 代碼如下:

var cache = {
"uuid1": { // DOM節點1緩存數據,"uuid1"相當于dom1[expando]
"name1": value1,
"name2": value2
},
"uuid2": { // DOM節點2緩存數據,“uuid2"相當于dom2[expando]
"name1": value1,
"name2": value2
}
// ......
};

每個uuid對應一個elem緩存數據,每個緩存對象是可以由多個name/value(名值對)對組成的,而value是可以是任何數據類型的。

簡單模擬實現
根據以上思路,就可以簡單實現下jQuery.data和jQuery.removeDate的功能了:
復制代碼 代碼如下:

(function(window, undefined) {
var cacheData = {}, // 用來存儲數據的對象
win = window, // 把window緩存給一個變量
uuid = 0,
// 聲明隨機數(8位)
// 注意+new Date()生成的隨機數是Number類型,與一個空字符串連接后(或使用toString方法轉型后)變成字符串,才可使用slice方法。
expando = "cacheData" + (+new Date() + "").slice(-8);
// (+new Date()).toString().slice(-8)等價于expando
// 寫入緩存
var data = function(elem, name, value) {
// 或使用原生方法驗證字符串Object.prototype.toString.call(elem) === "[object String]"
// 如果elem為字符串
if (typeof elem === "string") {
// 如果傳入name參數,則為寫入緩存
if (name !== undefined) {
cacheData[elem] = name;
}
// 返回緩存數據
return cacheData[elem];
// 如果elem為DOM節點
} else if (typeof elem === "object") {
var id,
thisCache;
// 如果elem不存在expando屬性,則添加一個expando屬性(第一次給元素設置緩存),否則直接獲取已有的expando和id值
if (!elem[expando]) {
id = elem[expando] = ++uuid;
thisCache = cacheData[id] = {};
} else {
id = elem[expando];
thisCache = cacheData[id];
}
// 把一個隨機數作為當前緩存對象的一個屬性,利用該隨機數就能找到該緩存對象
if (!thisCache[expando]) {
thisCache[expando] = {};
}
if (value !== undefined) {
// 將數據存到緩存對象中
thisCache[expando][name] = value;
}
// 返回DOM元素存儲的數據
return thisCache[expando][name];
}
};
// 刪除緩存
var removeData = function(elem, name) {
// 如果elem為字符串,則直接刪除該屬性值
if (typeof elem === "string") {
delete cacheData[elem];
// 如果key為DOM節點
} else if (typeof elem === "object") {
// 如果elem不存在expando屬性,則終止執行,不用刪除緩存
if (!elem[expando]) {
return;
}
// 檢測對象是否為空
var isEmptyObject = function(obj) {
var name;
for (name in obj) {
return false;
}
return true;
}
removeAttr = function() {
try {
// IE8即標準瀏覽器可以直接使用delete來刪除屬性
delete elem[expando];
} catch (e) {
// IE6/IE7使用removeAttribute方法來刪除屬性
elem.removeAttribute(expando);
}
},
id = elem[expando];
if (name) {
// 只刪除指定的數據
delete cacheData[id][expando][name];
// 如果是空對象,id所對應的數據對象全部刪除
if (isEmptyObject(cacheData[id][expando])) {
delete cacheData[id];
removeAttr();
}
} else {
// 刪除DOM元素存到緩存中的所有數據
delete cacheData[id];
removeAttr();
}
}
};
// 把data和removeData掛在window全局對象下,這樣在外部也能訪問到這兩個函數
win.expando = expando;
win.data = data;
win.removeData = removeData;
})(window, undefined);

例子:
HTML結構:
復制代碼 代碼如下:

<div id="demo" style="height: 100px; width: 100px; background: #ccc; color: #fff; margin: 20px; text-align: center; line-height: 100px;">
demo
</div>

js代碼:
復制代碼 代碼如下:

window.onload = function() {
// 測試
var demo = document.getElementById("demo");
// 寫入緩存
data(demo, "myName", "hcy");
console.log(data(demo, "myName")); // hcy
data(demo, "myBlog", "http://www.cnblogs.com/cyStyle");
console.log(data(demo, "myBlog")); // http://www.cnblogs.com/cyStyle
// 刪除DOM元素的某個緩存值
removeData(demo, "myBlog");
console.log(data(demo, "myBlog")); // undefined
console.log(data(demo, "myName")); // hcy
console.log(demo[expando]); // 1
// 刪除DOM元素
removeData(demo);
console.log(demo[expando]); // undefined
};

firefox下例子結果截圖:
 
對于上述例子實現jQuery的簡單緩存系統:先給該DOM元素添加一個隨機生成的屬性expando,這個屬性用來存放訪問緩存數據的id值,就好比DOM元素都有一把開啟緩存保險箱的鑰匙,只要有了鑰匙就可以隨時開啟緩存保險箱。 將本來存放到DOM元素中的數據都轉到了緩存中,而DOM元素本身只要存儲一個簡單的屬性就可以了,這樣就可以將由DOM元素引起的內存泄漏(具體會發生什么狀況不知道,大家都這么說~)的風險規避到最小。

結語
糊里糊涂地又到了最后,有一些術語或解釋上可能存在偏差,望各位童鞋指正和給出一些建議;另外,從理論上講, data和removeData方法可以用于任何對象的緩存, 不過如果運用于本地對象或window對象, 會存在內存泄露、循環引用等問題(^_^從網上看到的), 所以一般還是用于DOM節點比較適合,還可以結合事件、動畫對DOM節點進行緩存數據的操作。ps:cache真的很重要!需要慢慢體會~
因為分享,所以簡單;因為分享,所以快樂。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
国产精品一卡二卡三卡| 中文天堂av| 三级小说一区| 国产成a人亚洲精v品| 国产女人在线观看| 美女国产在线| 国产精品69一区二区三区| 国产视频福利| 在线免费看黄| 激情四房婷婷| 国产经典自拍视频在线观看| 午夜羞羞小视频在线观看| 青青草免费在线视频| 国产男女av| 国产亚洲精品久久久久久移动网络 | 国产三级视频在线看| 黄色电影网站在线观看| 黄色国产网站在线播放| 国产黄色在线免费观看| 在线中文字幕av| 欧美日韩亚洲第一页| 最近中文字幕大全中文字幕免费| 国产精品18久久久久网站| www狠狠操| 国产精品视频一区二区图片| 免费看黄视频网站| 国产超碰在线| 国产一级免费| 亚洲精品xxxxx| 国产毛片毛片毛片| 日本欧美在线视频免费观看| 国产网友自拍电影在线| 九九热在线播放| 天海翼中文字幕| 精品视频麻豆入口| 国产亚洲精品久久久久久青梅| 日韩精品免费一区二区| 国产youjizz在线| 国产区在线看| 国产在线播放av| 国精一区二区三区| www.成人.com| 日本久久网站| www.99av| 麻豆视频在线观看免费网站| av在线不卡网站| av在线天天| 欧洲亚洲精品视频| 国产在线黄色片| 欧美精品久久久久久久小说| 欧美日韩国产亚洲沙发| 成年女人在线视频| 国产在线视频精品视频免费看| 欧美另类在线视频| 九九热在线视频观看| 欧美日韩一区二区三区视视频| 国产精品一区二区三区四区色| 国产福利电影在线| 中文字幕视频在线免费| 激情四房婷婷| 国产网友自拍视频导航网站在线观看| 中文字幕高清av| 国产福利小视频在线| 国产区成人精品视频| 97高清视频| 青青久草在线| 天堂资源最新版在线视频观看免费网| 国产精品亚洲第五区在线| 国产午夜电影| free性亚洲| 国产网站在线免费观看| 在线视频色在线| 免费高清视频日韩| 国产二级片在线| av小说在线| 国产精品偷乱一区二区三区| 国产一区电影| 日本免费不卡| 国产高清大尺度一区二区不卡| 亚洲尤物在线视频| 中文字幕在线影视资源| 精品电影在线| 最好看更新中文字幕| 在线三级中文| 国产激情自拍| 国产精品亚洲色图| 人人干人人插| 精灵使的剑舞无删减版在线观看| 另类高清dbsm日本tvav| 国产福利电影在线观看| 国产精品外围在线观看| 久热中文字幕精品视频在线| 精品精品导航| 国产三区视频在线观看| 国产永久免费| 成年女人在线视频| 日本视频三区| 四虎国产精品永久地址998| 国产激情视频在线| 天堂在线免费观看| 免费在线观看a| 亚洲成人av高清| 在线亚洲精品自拍| 精品街拍一区二区| 国产黄色在线观看| 国产网站免费看| 国产情侣高潮对白| 国产黄a三级三级三级av在线看| 国产免费视频在线| 福利视频网站导航| 国产小视频免费在线观看| 91xxx在线观看| 国产网红女主播精品视频| 天堂中文在线视频| 国产一级二级三级在线观看| 国产一区二区三区福利| 国产日韩欧美第一页| 精品视频vs精品视频| 在线激情网站| а√天堂8资源在线官网| 天海翼中文字幕| 久久精品国产麻豆| 国产理论在线观看| 最好看更新中文字幕| 国产黄在线观看免费观看不卡| 国产超级va在线视频| wwww亚洲| 国产一二区在线| 亚洲国产日韩在线人成电影| 欧美精品日韩少妇| 午夜国产视频| 在线观看免费观看在线91| 日本h视频在线观看| 国产一区二区三区四区尤物| 91九色在线看| 国产在线超碰| 在线观看av网站永久| 国产一级粉嫩xxxx| 免费三级毛片| 国产高清免费视频| 黄色电影网站在线观看| 国产成人精品自线拍| 国产女人伦码一区二区三区不卡| 6699久久国产精品免费| 国产69久久| 中文岛国精品亚洲一区| 天天操天天曰| 精品一区二区三区高清免费不卡| 免费看的av| 国产经典av| 在线91av| 黄网站app在线观看下载视频大全官网| 国产精品国产国产aⅴ| 老司机精品视频一区二区| 怡红院av在线| 国产精品冒白浆免费视频| 蜜桃视频中文字幕| 亚洲v片在线观看| 在线国产一区二区三区| 国产高清在线看| 国产精品视频流白浆免费视频| 丁香六月婷婷| 国产中文在线| 国产毛片毛片毛片| baoyu777.永久免费视频| 在线视频观看你懂的| 在线伊人免费视频| 黄色av免费在线| 最新av中文字幕| 不卡av免费观看| av中文在线| 欧美亚洲系列| 福利视频网址导航| 日韩av成人| 中文字幕第一页av| 国产一二三区精品视频| 国产青草视频在线观看视频| 国产高清视频在线| 香蕉视频免费在线播放| 亚洲图区综合| 久久久久久久久亚洲精品| 国产免费视频| 91亚洲欧美| 人xxxx性xxxxx欧美| 成年人在线观看| 国产调教视频在线观看| 国产午夜视频| 精品成人免费自拍视频 | 国产美女在线播放| 天天操天天曰| 在线免费日韩| 非洲黑人最猛性xxxx交| 国产麻豆精品高清在线播放| 国产三区四区在线观看| 一色桃子av在线| 国产在线高潮| 99综合精品久久| 国产乱妇乱子| 日本成人网址| 6699久久国产精品免费|