Storage.js:
注意:此版本实现的存储在符合Web存储标准(ie8及ie8以上的版本与其他主流浏览器)的情况下与session的周期一致,但在页面不关闭的情况下没有过期时间,ie7及以下版本则默认是永久保存,但可以通过预留的方法setMaxAge(Number age)来设置有效期,设置0的话在关闭或刷新页面时会清除缓存。
(function initStorageClass(win){ var inherit=function(o){ if(o===null || o ===undefined) throw TypeError(); if(Object.create) return Object.create(o); var t = typeof o; if(t!=='object'&&t!=='function') throw TypeError(); function f(){} f.prototype=o; return new f(); }; var extend=function(a,b){ for ( var key in b) { a[key]=b[key]; } return a; }; var defineSubclass=function(superclass,constructor,methods,statics){ constructor.prototype=inherit(superclass.prototype); constructor.prototype.constructor=constructor; if(methods) extend(constructor.prototype,methods); if(statics) extend(constructor,statics); return constructor; }; Function.prototype.extend=function(constructor,methods,statics){ return defineSubclass(this,constructor,methods,statics); }; // 创建一个抽象类 var AbstractStorage=function AbstractStorage(){ throw new Error('Can\'t create abstract class instance'); }; // 添加抽象类的实例方法(已实现) extend(AbstractStorage.prototype,{ setItem:function(k,v){ k=encodeURIComponent(k); v=encodeURIComponent(v); this.storage.setItem(k,v); return this; }, getItem:function(k){ k=encodeURIComponent(k); return decodeURIComponent(this.storage.getItem(k)); }, removeItem:function(k){ k=encodeURIComponent(k); this.storage.removeItem(k); return this; }, setMaxAge:function(age){ // 为IE的userData版本预留了设置有效期的方法 if(isNaN(age)) throw new TypeError('userData\' max-age must be a number,but '+age+' is not a number'); if(this.model&&this.model==='userData') { var now=new Date().getTime(); var expires=now+age*1000; this.storage.expires=new Date(expires).toUTCString(); } else { throw new Error('sessionStorage did\'t support set max-age。'); } return this; } }); var Storage=null; if(win.Storage) {// 实现了Web存储标准的浏览器 Storage=AbstractStorage.extend( function WebStorage(){ // IE中实现了Web存储标准的版本,在本地目录下无法使用sessonStorage if(!win.sessionStorage) { throw new Error('local web is can\'t save sessionStorage'); } this.model='sessionStorage'; // 默认使用sessionStorage,也可以自己传入,model自行修改 this.storage=win.sessionStorage; } ); } else if(win.navigator.appVersion&&win.navigator.appVersion.indexOf('MSIE')>=0){ // 不支持web存储标准的IE浏览器(IE11的核心版本已和Netscape统一,IE8以上的支持web存储标准) Storage=(AbstractStorage.extend( function IEStorage(maxAge){ this.model='userData'; this.maxAge=maxAge; this.storage=(function initUserData(t){ var memory = document.createElement('div'); memory.style.display='none'; //附加userData行为 memory.style.behavior='url("#default#userData")'; document.appendChild(memory); if(t.maxAge) {// 设置userData有效期,默认永久,单位毫秒 var now=new Date().getTime(); var expires=now+t.maxAge*1000; memory.expires=new Date(expires).toUTCString(); } memory.load('UserDataStorage'); //载入存储的 extend(memory,{ setItem:function(k,v){ this.setAttribute(k,v); this.save('UserDataStorage'); return this; }, getItem:function(k){ return this.getAttribute(k)||null; }, removeItem:function(k){ this.removeAttribute(k); this.save('UserDataStorage'); return this; } }); return memory; }(this)); } )); } win.IStorage=Storage; win.memory=new Storage()||null;// 创建一个实例对象,可以在脚本中直接引用 }(window));
index.html(简单测试):
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <script type="text/javascript" src="Storage.js"></script> <script type="text/javascript"> window.onload=function(){ memory.setItem('test','success'); alert(memory.getItem('test')); }; </script> </head> <body> </body> </html>
在HTML页面中引用Storage.js文件,可以在宿主环境中直接使用已经生成的实例memory(window.memory)。也可以自己创建一个新实例new IStorage()
memory.setItem('test','success'); // add alert(memory.getItem('test')); // select memory.removeItem('test'); // delete
适用实现了Web存储标准的浏览器(Storage)与IE浏览器(userData),userData的生命周期请自行根据项目进行设置。