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 相关文章推荐
JavaScript对象、属性、事件手册集合方便查询
Jul 04 Javascript
js函数参数设置默认值的一种变通实现方法
May 26 Javascript
javascript控制层显示或隐藏的方法
Jul 22 Javascript
举例讲解JavaScript中关于对象操作的相关知识
Nov 16 Javascript
js中数组结合字符串实现查找(屏蔽广告判断url等)
Mar 30 Javascript
js实现消息滚动效果
Jan 18 Javascript
JavaScript截屏功能的实现代码
Jul 28 Javascript
vue2.0+vue-dplayer实现hls播放的示例
Mar 02 Javascript
详解JavaScript中的数组合并方法和对象合并方法
May 11 Javascript
对layui初始化列表的CheckBox属性详解
Sep 13 Javascript
vuex+axios+element-ui实现页面请求loading操作示例
Feb 02 Javascript
基于原生JS封装的Modal对话框插件的示例代码
Sep 09 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
根德YB400的电路分析
2021/03/02 无线电
一些常用的php函数
2006/12/06 PHP
PHP的PSR规范中文版
2013/09/28 PHP
php猴子选大王问题解决方法
2015/05/12 PHP
php unlink()函数使用教程
2018/07/12 PHP
PHP检查文件是否存在,不存在自动创建及读取文件内容操作示例
2020/01/23 PHP
div+css布局的图片连续滚动js实现代码
2010/05/04 Javascript
JavaScript 字符串处理函数使用小结
2010/12/02 Javascript
JsDom 编程小结
2011/08/09 Javascript
深入理解JavaScript系列(6) 强大的原型和原型链
2012/01/15 Javascript
html超链接打开窗口大小的方法
2013/03/05 Javascript
js图片跟随鼠标移动代码
2015/11/26 Javascript
基于Javascript实现的不重复ID的生成器
2016/12/25 Javascript
几行js代码实现自适应
2017/02/24 Javascript
Angular中$broadcast和$emit的使用方法详解
2017/05/22 Javascript
微信小程序自定义可滑动日历界面
2018/12/28 Javascript
解决Vue使用bus总线时,第一次路由跳转时数据没成功传递问题
2020/07/28 Javascript
python中利用Future对象异步返回结果示例代码
2017/09/07 Python
Python中的上下文管理器和with语句的使用
2018/04/17 Python
浅谈Python爬虫基本套路
2019/03/25 Python
python将print输出的信息保留到日志文件中
2019/09/27 Python
python画蝴蝶曲线图的实例
2019/11/21 Python
Python内置加密模块用法解析
2019/11/25 Python
使用分层画布来优化HTML5渲染的教程
2015/05/08 HTML / CSS
使用canvas实现黑客帝国数字雨效果
2020/01/02 HTML / CSS
描述一下JVM加载class文件的原理机制
2013/12/08 面试题
招商经理岗位职责
2013/11/16 职场文书
理工科学生的自我评价
2013/12/15 职场文书
护士毕业实习感言
2014/03/05 职场文书
乡镇干部个人整改措施思想汇报
2014/10/10 职场文书
校园游戏活动新闻稿
2014/10/15 职场文书
考研英语复习计划
2015/01/19 职场文书
慰问信格式规范
2015/03/23 职场文书
2016年企业先进员工事迹材料
2016/02/25 职场文书
《中国机长》观后感:敬畏生命,敬畏职责
2019/11/12 职场文书
TV动画「神渣☆爱豆」公开第一弹主视觉图
2022/03/21 日漫