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 相关文章推荐
基于jquery的一行代码轻松实现拖动效果
Dec 28 Javascript
javascript实现tabs选项卡切换效果(扩展版)
Mar 19 Javascript
获取非最后一列td值并将title设为该值的方法
Oct 30 Javascript
javascript类型转换示例
Apr 29 Javascript
JavaScript监听文本框回车事件并过滤文本框空格的方法
Apr 16 Javascript
jQuery垂直多级导航菜单代码分享
Aug 18 Javascript
jQuery EasyUI框架中的Datagrid数据表格组件结构详解
Jun 09 Javascript
JS封装的自动创建表格的实现代码
Jun 15 Javascript
Vue自定义指令介绍(2)
Dec 08 Javascript
uni-app之APP和小程序微信授权方法
May 09 Javascript
微信小程序实现渐入渐出动画效果
Jun 13 Javascript
vue实现水波涟漪效果的点击反馈指令
May 31 Vue.js
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
php从给定url获取文件扩展名的方法
2015/03/14 PHP
使用JavaScript switch case 另类写法
2010/03/14 Javascript
ASP.NET jQuery 实例10 动态修改hyperlink的URL值
2012/02/03 Javascript
JS刷新框架外页面七种实现代码
2013/02/18 Javascript
JS Map 和 List 的简单实现代码
2013/07/08 Javascript
JS实现的生成随机数的4个函数分享
2015/02/11 Javascript
JS实现向表格行添加新单元格的方法
2015/03/30 Javascript
jQuery基于图层模仿五星星评价功能的方法
2015/05/07 Javascript
js实现的倒计时按钮实例
2015/06/24 Javascript
js数组如何添加json数据及js数组与json的区别
2015/10/27 Javascript
jquery验证手机号是否正确实例讲解
2015/11/17 Javascript
jQuery Validate表单验证插件 添加class属性形式的校验
2016/01/18 Javascript
js中apply和Math.max()函数的问题及区别介绍
2018/03/27 Javascript
详解微信小程序调用支付接口支付
2019/04/28 Javascript
ECharts地图绘制和钻取简易接口详解
2019/07/12 Javascript
laypage+SpringMVC实现后端分页
2019/07/27 Javascript
详解JavaScript中new操作符的解析和实现
2020/09/04 Javascript
[05:26]2014DOTA2西雅图国际邀请赛 iG战队巡礼
2014/07/07 DOTA
python抓取网页时字符集转换问题处理方案分享
2014/06/19 Python
python实现多线程暴力破解登陆路由器功能代码分享
2015/01/04 Python
详解python单例模式与metaclass
2016/01/15 Python
Flask解决跨域的问题示例代码
2018/02/12 Python
python飞机大战pygame游戏框架搭建操作详解
2019/12/17 Python
python中return的返回和执行实例
2019/12/24 Python
python实现图片素描效果
2020/09/26 Python
Python+unittest+requests+excel实现接口自动化测试框架
2020/12/23 Python
香港草莓网土耳其网站:Strawberrynet TR
2017/03/02 全球购物
Ibatis中如何提高SQL Map的性能
2013/05/11 面试题
护理专业的自荐信
2013/10/22 职场文书
物流专业求职计划书
2014/01/10 职场文书
2014年党员承诺书范文
2014/05/20 职场文书
2015年南京大屠杀纪念日活动总结
2015/03/24 职场文书
2015年大学生党员承诺书
2015/04/27 职场文书
三好学生主要事迹怎么写
2015/11/03 职场文书
2019年大学毕业生个人自我鉴定范文大全
2019/03/21 职场文书
看古人们是如何赞美老师的?
2019/07/08 职场文书