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 相关文章推荐
IE8 中使用加速器(Activities)
May 14 Javascript
jquery无缝向上滚动实现代码
Mar 29 Javascript
jquery的live使用注意事项
Feb 18 Javascript
jquery.fastLiveFilter.js实现输入自动过滤的方法
Aug 11 Javascript
jQuery实现的网页右下角tab样式在线客服效果代码
Oct 23 Javascript
JS中的eval 为什么加括号
Apr 13 Javascript
微信小程序 swiper组件轮播图详解及实例
Nov 16 Javascript
推荐三款不错的图片压缩上传插件(webuploader、localResizeIMG4、LUploader)
Apr 21 Javascript
JavaScript判断变量名是否存在数组中的实例
Dec 28 Javascript
JavaScript进阶(三)闭包原理与用法详解
May 09 Javascript
JS forEach跳出循环2种实现方法
Jun 24 Javascript
token 机制和实现方式
Dec 15 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 中英文混合排版中处理字符串常用的函数
2007/04/12 PHP
来自phpguru得Php Cache类源码
2010/04/15 PHP
Yii学习总结之安装配置
2015/02/22 PHP
PHP给前端返回一个JSON对象的实例讲解
2018/05/31 PHP
jQuery中常用的遍历函数用法实例总结
2015/09/01 Javascript
jQuery Validate验证框架详解(推荐)
2016/12/17 Javascript
[js高手之路]HTML标签解释成DOM节点的实现方法
2017/08/31 Javascript
vue.js实现插入数值与表达式的方法分析
2018/07/06 Javascript
微信小程序自定义组件之可清除的input组件
2018/07/17 Javascript
JS实现图片上传多次上传同一张不生效的处理方法
2018/08/06 Javascript
小程序云开发实现数据库异步操作同步化
2019/05/18 Javascript
10种JavaScript最常见的错误(小结)
2019/06/21 Javascript
nodejs使用node-xlsx生成excel的方法示例
2019/08/22 NodeJs
简单分析js中的this的原理
2019/08/31 Javascript
SpringBoot在yml配置文件中配置druid的操作
2020/11/16 Javascript
35个Python编程小技巧
2014/04/01 Python
详解Python3中yield生成器的用法
2015/08/20 Python
Tensorflow环境搭建的方法步骤
2018/02/07 Python
python爬取淘宝商品详情页数据
2018/02/23 Python
Python OpenCV读取png图像转成jpg图像存储的方法
2018/10/28 Python
python提取包含关键字的整行数据方法
2018/12/11 Python
python 执行终端/控制台命令的例子
2019/07/12 Python
python实现大文本文件分割
2019/07/22 Python
学python安装的软件总结
2019/10/12 Python
python GUI库图形界面开发之PyQt5复选框控件QCheckBox详细使用方法与实例
2020/02/28 Python
html5组织文档结构_动力节点Java学院整理
2017/07/11 HTML / CSS
静态成员和非静态成员的区别
2012/05/12 面试题
大学英语演讲稿范文
2014/04/24 职场文书
支行行长竞聘演讲稿
2014/05/15 职场文书
企业文化标语大全
2014/06/10 职场文书
公司年底活动方案
2014/08/17 职场文书
助学金感谢信
2015/01/20 职场文书
学校节水倡议书
2015/04/29 职场文书
交通事故调解协议书
2015/05/20 职场文书
电话营销开场白
2015/05/29 职场文书
现实表现证明材料
2015/06/19 职场文书