javascript客戶(hù)端解決方案 緩存提供程序
這是介紹的是一個(gè)不錯(cuò)的javascript的方面的客戶(hù)端解決方案,可選配支持HTML5本地存儲(chǔ)器.
Starting Simple
function CacheProvider() {
// values will be stored here
this._cache = {};
}Feature detect on local storage
try {
CacheProvider.hasLocalStorage = ('localStorage' in window) && window['localStorage'] !== null;
} catch (ex) {
CacheProvider.hasLocalStorage = false;
}
這里使用try catch的主要原因是 盡管firefox支持該屬性,但是需要在about:config中設(shè)置并開(kāi)啟,否則將會(huì)報(bào)錯(cuò)。所以一個(gè)簡(jiǎn)單的if else不能滿(mǎn)足需求。
下面我們將增加對(duì)象本地存儲(chǔ)機(jī)制的支持。這個(gè)技術(shù)是借鑒了Christopher Blizzard的一篇不錯(cuò)的文章 Saving data with local storage – for which those who didn't know, you can only store string's into local storage. Thus we have this…
in / out JSON parsing
if (CacheProvider.hasLocalStorage) {
Storage.prototype.setObject = function(key, value) {
this.setItem(key, JSON.stringify(value));
};
Storage.prototype.getObject = function(key) {
return JSON.parse(this.getItem(key));
};
}
現(xiàn)在就到了我們的三個(gè)核心方法了,分別是 get, set, 和clear.
Core class functionality
CacheProvider.prototype = {
/**
* {String} k - the key
* {Boolean} local - get this from local storage?
* {Boolean} o - is the value you put in local storage an object?
*/
get: function(k, local, o) {
if (local && CacheProvider.hasLocalStorage) {
var action = o ? 'getObject' : 'getItem';
return localStorage[action](k) || undefined;
} else {
return this._cache[k] || undefined;
}
},
/**
* {String} k - the key
* {Object} v - any kind of value you want to store
* however only objects and strings are allowed in local storage
* {Boolean} local - put this in local storage
*/
set: function(k, v, local) {
if (local && CacheProvider.hasLocalStorage) {
if (typeof v !== 'string')) {
// make assumption if it's not a string, then we're storing an object
localStorage.setObject(k, v);
} else {
try {
localStorage.setItem(k, v);
} catch (ex) {
if (ex.name == 'QUOTA_EXCEEDED_ERR') {
// developer needs to figure out what to start invalidating
throw new Exception(v);
return;
}
}
}
} else {
// put in our local object
this._cache[k] = v;
}
// return our newly cached item
return v;
},
/**
* {String} k - the key
* {Boolean} local - put this in local storage
* {Boolean} o - is this an object you want to put in local storage?
*/
clear: function(k, local, o) {
if (local && CacheProvider.hasLocalStorage) {
localStorage.removeItem(k);
}
// delete in both caches - doesn't hurt.
delete this._cache[k];
}
};
如何運(yùn)用?
注意在這篇文章的開(kāi)始,就說(shuō)了Cache Provider 是可選支配的本地存儲(chǔ),首先然讓我們看一個(gè)沒(méi)有本地存儲(chǔ)的例子:
getElementsByClassName
var cache = new CacheProvider;
window.getElementsByClassName = getElementsByClassName || function(c) {
var reg = cache.get(c) || cache.set(c, new RegExp("(?:^|s+)" + c + "(?:s+|$)"));
var elements = document.getElementsByTagName('*');
var results = [];
for (var i = 0; i < elements.length; i++) {
if (elements[i].className.match(reg)) {
results.push(elements[i]);
}
}
return results;
};
備注:下次你調(diào)用類(lèi)函數(shù)的時(shí)候, 將會(huì)用預(yù)先編譯好的正則表達(dá)式替代夠建造一個(gè)表達(dá)式。
再舉一個(gè)例子:比如 對(duì)于大的應(yīng)用程序需要i18n,你可以緩存一個(gè)編譯好的html字符串進(jìn)入本地存儲(chǔ)中。
var i18nCache = new CacheProvider;
if (i18nCache.get('topnav')) {
$('#nav').html(i18nCache.get('topnav'));
} else {
ajax('top-nav.tmpl', function(html) {
i18nCache.set('topnav', html);
$('#nav').html(i18nCache.get('topnav'));
});
}
除此之外,你開(kāi)可以做很多外部資源緩存到本地的事情,加油:)
相關(guān)文章
關(guān)于微信jssdk實(shí)現(xiàn)多圖片上傳的一點(diǎn)心得分享
這篇文章主要介紹了關(guān)于微信jssdk實(shí)現(xiàn)多圖片上傳的一點(diǎn)心得分享,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-12-12在TypeScript中迭代對(duì)象鍵Object.keys不起作用的原因和解決方案
在TypeScript中迭代對(duì)象鍵object?keys可能是一場(chǎng)噩夢(mèng),以下是我所知道的所有解決方案,文中有詳細(xì)的代碼示例供大家參考,具有一定的參考價(jià)值,需要的朋友可以參考下2023-10-10js實(shí)現(xiàn)仿購(gòu)物車(chē)加減效果
本文主要介紹了js實(shí)現(xiàn)仿購(gòu)物車(chē)+ -效果的實(shí)例,具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-03-03JS 組件系列之Bootstrap Table的凍結(jié)列功能徹底解決高度問(wèn)題
這篇文章主要介紹了JS 組件系列之Bootstrap Table的凍結(jié)列功能徹底解決高度問(wèn)題,需要的朋友可以參考下2017-06-06layui 實(shí)現(xiàn)自動(dòng)選擇radio單選框(checked)的方法
今天小編就為大家分享一篇layui 實(shí)現(xiàn)自動(dòng)選擇radio單選框(checked)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-09-09由淺入深講解Javascript繼承機(jī)制與simple-inheritance源碼分析
Javascript語(yǔ)言對(duì)繼承實(shí)現(xiàn)的并不好,需要工程師自己去實(shí)現(xiàn)一套完整的繼承機(jī)制。下面我們由淺入深的系統(tǒng)掌握使用javascript繼承的技巧,對(duì)javascript繼承相關(guān)知識(shí)感興趣的朋友一起看看吧2015-12-12JavaScript使用atan2來(lái)繪制箭頭和曲線的實(shí)例
下面小編就為大家?guī)?lái)一篇JavaScript使用atan2來(lái)繪制箭頭和曲線的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09JavaScript獲取網(wǎng)頁(yè)中第一個(gè)圖片id的方法
這篇文章主要介紹了JavaScript獲取網(wǎng)頁(yè)中第一個(gè)圖片id的方法,涉及javascript中document.images方法的使用技巧,需要的朋友可以參考下2015-04-04