javascript客户端解决方案 缓存提供程序


Posted in Javascript onJuly 14, 2010

相信每一个开发者都知道缓存的重要性。从头至尾有缓存的后台(memcached,xcache等。) 来减轻db的压力。对内容分发网络(CDN)缓存中希望你的浏览器缓存那些不止一次的加载资源。当然, 有客户端缓存,所以你不要重复昂贵的操作(即使是算法或大量的运算)。

这是介绍的是一个不错的javascript的方面的客户端解决方案,可选配支持HTML5本地存储器.

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中设置并开启,否则将会报错。所以一个简单的if else不能满足需求。

下面我们将增加对象本地存储机制的支持。这个技术是借鉴了Christopher Blizzard的一篇不错的文章 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)); 
}; 
}

现在就到了我们的三个核心方法了,分别是 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]; 
} 
};

如何运用?
注意在这篇文章的开始,就说了Cache Provider 是可选支配的本地存储,首先然让我们看一个没有本地存储的例子:

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; 
};

备注:下次你调用类函数的时候, 将会用预先编译好的正则表达式替代够建造一个表达式。

再举一个例子:比如 对于大的应用程序需要i18n,你可以缓存一个编译好的html字符串进入本地存储中。

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')); 
}); 
}

除此之外,你开可以做很多外部资源缓存到本地的事情,加油:)
Javascript 相关文章推荐
让textarea自动调整大小的js代码
Apr 12 Javascript
基于jQuery的弹出框插件
Mar 18 Javascript
js与运算符和或运算符的妙用
Feb 14 Javascript
javascript中substring()、substr()、slice()的区别
Aug 30 Javascript
javascript实现动态统计图开发实例
Nov 21 Javascript
Bootstrap进度条实现代码解析
Mar 07 Javascript
Vue2组件tree实现无限级树形菜单
Mar 29 Javascript
JS解决position:sticky的兼容性问题的方法
Oct 17 Javascript
Angular实现的日程表功能【可添加及隐藏显示内容】
Dec 27 Javascript
详解关于element级联选择器数据回显问题
Feb 20 Javascript
javascript网页随机点名实现过程解析
Oct 15 Javascript
详解CocosCreator消息分发机制
Apr 16 Javascript
IE6图片加载的一个BUG解决方法
Jul 13 #Javascript
IE中createElement需要注意的一个问题
Jul 13 #Javascript
不要在cookie中使用特殊字符的原因分析
Jul 13 #Javascript
初识javascript 文档碎片
Jul 13 #Javascript
JavaScript性能优化 创建文档碎片(document.createDocumentFragment)
Jul 13 #Javascript
通过继承IHttpHandle实现JS插件的组织与管理
Jul 13 #Javascript
jQuery.Autocomplete实现自动完成功能(详解)
Jul 13 #Javascript
You might like
dedecms模板标签代码官方参考
2007/03/17 PHP
用php和jQuery来实现“顶”和“踩”的投票功能
2016/10/13 PHP
PHP实现基于栈的后缀表达式求值功能
2017/11/10 PHP
alixixi runcode.asp的代码不错的应用
2007/08/08 Javascript
javascript TextArea动态显示剩余字符
2008/10/22 Javascript
javascript form 验证函数 弹出对话框形式
2009/06/23 Javascript
js购物车实现思路及代码(个人感觉不错)
2013/12/23 Javascript
js动态创建标签示例代码
2014/06/09 Javascript
jQuery判断checkbox是否选中的3种方法
2014/08/12 Javascript
jQuery中innerWidth()方法用法实例
2015/01/19 Javascript
使用jQueryMobile实现滑动翻页效果的方法
2015/02/04 Javascript
JS判断网页广告是否被浏览器拦截过滤的代码
2015/04/05 Javascript
以Python代码实例展示kNN算法的实际运用
2015/10/26 Javascript
nodejs个人博客开发第四步 数据模型
2017/04/12 NodeJs
JavaScript错误处理和堆栈追踪详解
2017/04/18 Javascript
Vue.js使用$.ajax和vue-resource实现OAuth的注册、登录、注销和API调用
2017/05/10 Javascript
mpvue 如何使用腾讯视频插件的方法
2018/07/16 Javascript
JS实现根据数组对象的某一属性排序操作示例
2019/01/14 Javascript
vue+elementUI实现表单和图片上传及验证功能示例
2019/05/14 Javascript
Angular封装表单控件及思想总结
2019/12/11 Javascript
详解Typescript里的This的使用方法
2021/01/08 Javascript
[48:47]VGJ.S vs NB 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python ORM框架SQLAlchemy学习笔记之数据查询实例
2014/06/10 Python
jupyter lab文件导出/下载方式
2020/04/22 Python
python库skimage给灰度图像染色的方法示例
2020/04/27 Python
python 基于opencv实现图像增强
2020/12/23 Python
鼠标滚轮事件和Mac触控板双指事件
2019/12/23 HTML / CSS
企业厂务公开实施方案
2014/03/26 职场文书
合伙协议书范本
2014/04/21 职场文书
医师定期考核实施方案
2014/05/07 职场文书
爱护花草树木的标语
2014/06/11 职场文书
电子信息工程专业求职信
2014/06/28 职场文书
小学语文教师研修感悟
2015/11/18 职场文书
创业者如何撰写出一份打动投资人的商业计划书?
2019/07/02 职场文书
Go Gin实现文件上传下载的示例代码
2021/04/02 Golang
mysql sql常用语句大全
2022/06/21 MySQL