基于'sessionStorage'与'userData'的类session存储

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存储标准的版本,在本地目录下无法使用sessonStorageif(!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的生命周期请自行根据项目进行设置。

转载于:https://www.cnblogs.com/gabin/p/3723892.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/293777.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android之FLAG_ACTIVITY_TASK_ON_HOME

FLAG_ACTIVITY_TASK_ON_HOME :把当前新启动的任务置于Home任务之上&#xff0c;也就是按back键从这个任务返回的时候会回到home&#xff0c;即使这个不是他们最后看见的activity 注意这个标记必须和FLAG_ACTIVITY_NEW_TASK一起使用。 实例&#xff1a; 一个apk中有MainActiv…

C# WPF中添加调试信息查看窗体

第一步&#xff1a;添加wpf窗口&#xff1b;第二步&#xff1a;在主窗体image的MouseLeftButtonUp事件中调用调试窗口&#xff1b;StatusViewWindow svWindow new StatusViewWindow();svWindow.Show();第三步&#xff1a;在主窗体中开个线程通过udp接收光电广开的数据&#xf…

杨振宁追求的物理美学,居然在这里实现,物理学史上颜值最高的组合,看完后跪了……

全世界只有3.14 % 的人关注了爆炸吧知识一沙见世界 一花窥天堂手心握无限 须臾纳永恒杨振宁曾说读上面的四句诗可以感受到物理的美但物理的美不止于此物理还有一种庄严美一种神秘美一种初窥宇宙奥秘的畏惧美物理就是如此的迷人任何语言在它的面前都很贫瘠数学让人摆脱了愚昧而…

《SAS编程与数据挖掘商业案例》学习笔记之一

今天有空看到一本挺不错的书&#xff0c;仔细阅读&#xff0c;发现很多有用的知识点&#xff0c;于是认真研读起来&#xff0c;以下是初步的要点笔记。 切换至日志窗口的命令是log、热键是F6&#xff1b; 切换至输出窗口的命令是output、热键是F7&#xff1b; 切换至编辑器窗口…

mysql字段使用timestamp类型和默认值CURRENT_TIMESTAMP表示默认为时间,类似mssql的getdate()功能;字段自增...

在mssql数据库中&#xff0c;时间字段如果想使用当前的时间&#xff0c;默认值是 getdate() 在mysql里面&#xff0c;如果是用 datetime类型&#xff0c;值用now() 是不允许的。 修改为 timestamp类型和默认值CURRENT_TIMESTAMP表示默认为时间&#xff0c;即可以达到mssql里面…

FirewallD is not running

2019独角兽企业重金招聘Python工程师标准>>> 1.发现安装好tomcat后&#xff0c;发现无法访问tomcat首页&#xff0c;后来发现防火墙没有开放8080端口。 需注意的是&#xff1a;CentOS 7防火墙换用Friewalld了&#xff0c;所以要用以下命令将端口号加进防火墙&#x…

Android之FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET

FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET&#xff1a;重置该task时清除该activity这个标志将会非常有用当你想在你的应用中有个逻辑切换&#xff0c;例如&#xff0c;一个 e-mail的应用可能用于一个命令去显示附件&#xff0c;这个命令启动一个图片浏览的activity去显示附件&#…

Dom4J 解析xml ,类查询

/*** 从XML文件比对&#xff0c;传入provinceId 返回 provinceShortName * param provinceid* return*/public static String provinceIdEXprovinceCodeFromXml(String provinceid){ String provinceShortName"";try { SAXReader sax new SAXReader(); File filene…

三年租男友回家竟花了10万......

1 不要让别人一天毁了它&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 每天一个单身小技巧&#xff08;via.最佳蹲坑读物&#xff0c;侵删&#xff09;▼3 被封印在木桩里的哆啦A梦&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 大家的对象都是哪里…

《SAS编程与数据挖掘商业案例》学习笔记之二

继续之前的读书笔记&#xff0c;废话少说&#xff0c;直奔主题。 四.连接数据库的方式 libname形式&#xff1a; Oracle 链接&#xff1a;Libname IBMSHCU oracle userbi passwordbi schemaeduc; DB2链接&#xff1a;libname hsdb db2 userxxx password"xxx" datas…

微信重磅更新!这个功能等了 7 年

腾讯近日发布适用于 Windows 和 macOS 的新版微信客户端&#xff0c;本次主要更新如下&#xff1a;1.自动登录此前微信针对全新“自动登录该设备”功能进行了小范围的测试&#xff0c;本次更新后所有用户都可以使用该功能。当您勾选“自动登录该设备”后&#xff0c;微信将开启…

利用MyBatis Generator自动创建代码

如果你使用过hibernate的eclipse插件自动创建DAO文件&#xff0c;那么就容易理解下面介绍的内容&#xff1b;如果你还没有用过hibernate也无妨。下面介绍使用mybatis 3的eclipse插件自动生成相关文件以及如何使用这些文件。eclipse插件安装地址&#xff1a;http://mybatis.goog…

Navicat Premium 怎么安装比较快

Navicat Premium是一套数据库管理工具&#xff0c;结合其它Navicat成员&#xff0c;支持单一程序同时连接到MySQL、MariaDB、SQL Server、SQLite、Oracle和PostgreSQL数据库。将此工具连接数据库&#xff0c;你可以从中看到各种数据库的详细信息.包括报错&#xff0c;等等.当然…

.netCHARTING图表控件详细介绍及下载

.netCHARTING是一款功能强大的图表控件&#xff0c;利用.NET framework和GDI为工作于ASP.NET和Winform的C#和VB.NET开发人员提供可托管的图表解决方案&#xff0c;提供了多种2D和3D图表类型以及组合图、仪表&#xff0c;完全支持iPhone, iOS, Andoid, WP7 & Tablet &#x…

《SAS编程与数据挖掘商业案例》学习笔记之三

五&#xff1a;set语句 1.keep和drop指定变量进入或者不进入pdv eg&#xff1a; Data d1(keepname) data d2 (keepname sex); set sashelp.class(keepname sex rename(namename_new sexsex_new) where(sexM) firstobs3 obs5); Run; 注&#xff1a; 黄色部分标示只有name …

你距离哈佛学霸到底有多远?实力证明,真正的学霸精神不是智商,而是。。。

▲ 点击查看科学家曾在基于脑科学和认知科学后得出一个“学习的金字塔”理论。就是下面这张图&#xff1a;顶端的就是我们所谓的“知识”&#xff0c;但为了可以达到这个顶端&#xff0c;下面有一系列的支撑能力。而引申出来的核心概念&#xff0c;就叫“玩中学”。不要想当然地…

Android之IPC通信中的UID和PID识别

PCThreadState对象维护了2个变量 pid_t mCallingPid; uid_t mCallingUid; 从变量名称来看&#xff0c;这2个变量保存了进程的PID和UID&#xff0c;并且由于这两个变量由IPCThreadState对象维护&#xff0c;可见它们是与IPC相关的。具体它们保存的是…

通过system调用Am命令执行动作

在底层代码中看到这样一条语句&#xff1a; system("/system/bin/sh -c \"am broadcast -a android.intent.action.AT_AIRPLANE_MODE --ez state true\""); system 这是干什么的啊&#xff1f;&#xff1f; 经google原来system是系统调用&#xff0c;执行一…

在 ASP.NET Core 中使用托管服务实现后台任务

在 ASP.NET Core 中&#xff0c;后台任务作为托管服务实现。托管服务是一个类&#xff0c;具有实现 IHostedService 接口的后台任务逻辑。ASP.NET Core 辅助角色服务模板可作为编写长期服务应用的起点。通过辅助角色服务模板创建的应用将在其项目文件中指定 Worker SDK&#xf…

Framer – 将视觉搞转换为更真实的动态原型

Framer 是一个 JavaScript 框架&#xff0c;简化了创建现实原型&#xff0c;实现完整的3D效果。以一种简单&#xff0c;可读的和强大的方式定义交互和创建动画。 另外还有 Framer Generator 是一个桌面应用程序&#xff0c;从 Photoshop 文件导入资源和和文件夹层次结构。你的…