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 相关文章推荐
定义select的边框颜色
Apr 28 Javascript
使用JavaScript动态设置样式实现代码(2)
Jan 25 Javascript
javascript中Object使用详解
Jan 26 Javascript
Javascript核心读书有感之语言核心
Feb 01 Javascript
bootstrap datetimepicker实现秒钟选择下拉框
Jan 05 Javascript
jQuery插件FusionWidgets实现的Cylinder图效果示例【附demo源码】
Mar 23 jQuery
关于使用js算总价的问题
Jun 23 Javascript
jQuery读取本地的json文件(实例讲解)
Oct 31 jQuery
Vue引入jquery实现平滑滚动到指定位置
May 09 jQuery
微信小程序自定义多选事件的实现代码
May 17 Javascript
微信小程序实现城市列表选择
Jun 05 Javascript
详解解决小程序中webview页面多层history返回问题
Aug 20 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
在命令行下运行PHP脚本[带参数]的方法
2010/01/22 PHP
PHP 关于访问控制的和运算符优先级介绍
2013/07/08 PHP
PHP文件大小格式化函数合集
2014/03/10 PHP
php上传功能集后缀名判断和随机命名(强力推荐)
2015/09/10 PHP
CI操作cookie的方法分析(基于helper类库)
2016/03/28 PHP
PHP连接MySQL数据库操作代码实例解析
2020/07/11 PHP
javascript arguments使用示例
2014/12/16 Javascript
DOM基础教程之使用DOM + Css
2015/01/20 Javascript
ES6记录异步函数的执行时间详解
2016/08/31 Javascript
jQuery validate插件功能与用法详解
2016/12/15 Javascript
BootStrap CSS全局样式和表格样式源码解析
2017/01/20 Javascript
Vue和Bootstrap的整合思路详解
2017/06/30 Javascript
JS实现关键词高亮显示正则匹配
2018/06/22 Javascript
VUE2.0 ElementUI2.0表格el-table自适应高度的实现方法
2018/11/28 Javascript
VueCli生产环境打包部署跨域失败的解决
2020/11/13 Javascript
python发送伪造的arp请求
2014/01/09 Python
Python压缩和解压缩zip文件
2015/02/14 Python
python通过自定义isnumber函数判断字符串是否为数字的方法
2015/04/23 Python
Python2.7下安装Scrapy框架步骤教程
2017/12/22 Python
python写程序统计词频的方法
2019/07/29 Python
pip 安装库比较慢的解决方法(国内镜像)
2019/10/06 Python
python 实现多维数组(array)排序
2020/02/28 Python
python3用urllib抓取贴吧邮箱和QQ实例
2020/03/10 Python
Django vue前后端分离整合过程解析
2020/11/20 Python
给校长的建议书600字
2014/05/15 职场文书
四风问题自查自纠工作情况报告
2014/10/28 职场文书
承诺函格式模板
2015/01/21 职场文书
大学生村官工作总结2015
2015/04/09 职场文书
员工加薪申请报告
2015/05/15 职场文书
朋友聚会开场白
2015/06/01 职场文书
红色故事汇观后感
2015/06/18 职场文书
学雷锋主题班会教案
2015/08/13 职场文书
2016年植树节红领巾广播稿
2015/12/17 职场文书
准备去美国留学,那么大学申请文书应该怎么写?
2019/08/12 职场文书
MySQL 数据恢复的多种方法汇总
2021/06/21 MySQL
Vue2.0搭建脚手架
2022/03/13 Vue.js