本地存储是HTML5中提出来的概念,分localStorage和sessionStorage。通过本地存储,web应用程序能够在用户浏览器中对数据进行本地的存储。与 cookie 不同,存储限制要大得多(至少5MB),并且信息不会被传输到服务器。

什么时候用本地存储?

  跨期:不同时间打开页面,比如这次登录需要用到上次登录时保存的数据。

  跨页:在同一个浏览器打开同域的多个标签页,它们之间需要互通数据。

选用哪种存储方式?

  最简单的数据保存方式就是在js里定义变量并赋值,这不属于本地存储的范畴,但大多数情况下这样做就够了。

  cookie的适用场景:数据量小;数据需要随http请求传递到服务端;存储有具体时限的数据;低版本浏览器,不支持localStorage和sessionStorage时。

  localStorage的使用场景:数据大于4k;需要跨标签页使用数据;长期存储数据;

  sessionStorage的适用场景:数据只在本次会话有效;数据仅在当前标签页有效。sessionStorage对比直接js赋值变量的优势,是可以在同页面跨iframe使用。

  浏览器自身会缓存img、js、css等数据,localStorage也可以起到类似作用。

整理本地存储方法

  基于localStorage制作一个本地存储插件storage.js,针对只能存字符串、不能设置时限等进行补充,设想:

  • 在不支持localStorage时自动使用cookie
  • 类型转换,可存储数字、布尔、对象等
  • 可设置时限,超时就自我删除
  • 附带整理cookie方法

  用法展示:

    /** setItem( key, value, time)
* key: 键名,字符串
* value:键值,可以是Stirng/Boolean/Number/Object等类型
* time: 超时时间,非必填,数字型(单位毫秒)。默认长期有效。
**/
storage.setItem("text", "this is string");
storage.setItem("money", 1234);
storage.setItem("person", {name: "Jone"}, 24*60*60*1000); // getItem 获取值
storage.getItem("money"); //返回数字类型的值1234 // removeItem 删除某数据
storage.removeItem("money"); // clear 清除所有数据
storage.clear(); // 类似方法,操作cookie,只限于存储字符串
storage.setCookie("mycookie", "this is string", 60*60*24*30);
storage.getCookie("mycookie");
storage.removeCookie("mycookie");
storage.clearCookie();

  storage.js :

(function(window) {
var storage = {}; // 是否支持localStorage
if (!window.localStorage) {
storage.support = false;
} else {
storage.support = true;
} // time为超时时间(单位毫秒),非必填
storage.setItem = function(key, value, time) {
if (this.support) {
if (typeof key != "string") {
console.log("*STORAGE ERROR* key必须是字符串");
return;
}
if (time) {
if (typeof time != "number") {
console.log("*STORAGE ERROR* time必须是数字");
return;
} else {
time = parseInt(time) + (new Date()).getTime();
}
} else {
time = null;
}
var setValue = {
value: JSON.stringify(value),
time: time
}
localStorage.setItem(key, JSON.stringify(setValue));
} else {
storage.setCookie(key, value, time)
}
}; // 不存在的值会返回null
storage.getItem = function(key) {
if (this.support) {
var getValue = JSON.parse(localStorage.getItem(key));
if (!getValue) {
return null;
}
if (getValue.time && getValue.time < (new Date()).getTime()) {
localStorage.removeItem(key);
return null;
} else {
return JSON.parse(getValue.value)
}
} else {
storage.getCookie(key)
}
}; // 移除某个值
storage.removeItem = function(key) {
if (this.support) {
localStorage.removeItem(key);
} else {
storage.removeCookie(key)
}
};
// 清空存储
storage.clear = function() {
if (this.support) {
localStorage.clear();
} else {
storage.clearCookie();
}
}; /**** cookie方法 ****/
storage.setCookie = function(key, value, time) {
if (typeof key != "string") {
console.log("*STORAGE ERROR* key必须是字符串");
return;
} else {
if (typeof time != "number") {
// cookie默认存365天
time = 365 * 24 * 60 * 60 * 1000;
}
var d = new Date();
d.setTime(d.getTime() + time);
document.cookie = key + "=" + value + "; expires=" + d.toGMTString();
}
};
storage.getCookie = function(key) {
var cookies = document.cookie.split(";")
var cookieValue;
for (var i = 0; i < cookies.length; i++) {
if (key == cookies[i].split("=")[0]) {
cookieValue = cookies[i].split("=")[1];
break;
}
}
return cookieValue;
};
storage.removeCookie = function(key) {
document.cookie = key + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT";
};
storage.clearCookie = function() {
var cookies = document.cookie.split(";")
for (var i = 0; i < cookies.length; i++) {
document.cookie = cookies[i].split("=")[0] + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT";
}
}; window.storage = storage;
})(window)

  

localStorage/cookie 用法分析与简单封装的更多相关文章

  1. jquery.cookie用法详细解析,封装的操作cookie的库有jquery.cookie.js

    jquery.cookie用法详细解析 需要注意存入cookie前,对数据进行序列化, 得到后在反序列化: 熟练运用:JSON.stringify();和JSON.parse(): 通常分为如下几个步 ...

  2. Android AsyncTask 深度理解、简单封装、任务队列分析、自定义线程池

    前言:由于最近在做SDK的功能,需要设计线程池.看了很多资料不知道从何开始着手,突然发现了AsyncTask有对线程池的封装,so,就拿它开刀,本文将从AsyncTask的基本用法,到简单的封装,再到 ...

  3. 面localStorage用作数据缓存的简易封装

    面localStorage用作数据缓存的简易封装 最近做了一些前端控件的封装,需要用到数据本地存储,开始采用cookie,发现很容易就超过了cookie的容量限制,于是改用localStorage,但 ...

  4. 孟老板 BaseAdapter封装 (一) 简单封装

    BaseAdapter封装(一) 简单封装 BaseAdapter封装(二) Header,footer BaseAdapter封装(三) 空数据占位图 BaseAdapter封装(四) PageHe ...

  5. sessionStorage & localStorage & cookie

    sessionStorage & localStorage & cookie 概念 html5中的Web Storage包括了两种存储方式:sessionStorage和localSt ...

  6. python网页请求urllib2模块简单封装代码

    这篇文章主要分享一个python网页请求模块urllib2模块的简单封装代码. 原文转自:http://www.jbxue.com/article/16585.html 对python网页请求模块ur ...

  7. 对pymysql的简单封装

    #coding=utf-8 #!/usr/bin/python import pymysql class MYSQL: """ 对pymysql的简单封装 "& ...

  8. python笔记之常用模块用法分析

    python笔记之常用模块用法分析 内置模块(不用import就可以直接使用) 常用内置函数 help(obj) 在线帮助, obj可是任何类型 callable(obj) 查看一个obj是不是可以像 ...

  9. sessionStorage和localStorage的用法,不同点和相同点

    一,共同点 (1)存储时用setItem: localStorage.setItem("key","value");//以"key"为名称存 ...

随机推荐

  1. docker学习实践之路[第二站]nginx镜像实践

    上一篇文章中已经成功的拉取的nginx的镜像 在本篇文章中则详细介绍docker利用文件卷.断后映射然后进行nginx的配置. 输入一下命令: docker run -d --name mynginx ...

  2. Zookeeper--0300--java操作Zookeeper,临时节点实现分布式锁原理

    删除Zookeeper的java客户端有  : 1,Zookeeper官方提供的原生API, 2,zkClient,在原生api上进行扩展的开源java客户端 3, 一.Zookeeper原生API ...

  3. COM+时代的自动事务

    最近看公司的遗留项目代码,调试的时候发现经常报分布式事务错误,可是整个代码里没有看见开启过事务,于是开始研究,发现了这个.Net Framework1.1时代的产物. namespace Busine ...

  4. 【nodejs】文件上传demo实现

    文件结构: index.js var server = require('./server.js'); var router = require('./router.js'); var request ...

  5. mycat中间件--linux安装mycat1.6版本

    一.mycat安装前准备1.mycat下载地址,点击此处进行下载2.环境要求如下: mycat使用Java开发,因为用到了JDK 7的部分功能,所以在使用前请确保安装了JDK 7.0,并设置了正确的J ...

  6. Disruptor入门

    一.什么是 Disruptor Disruptor是一个高性能的异步处理框架,或者可以认为是最快的消息框架(轻量的JMS),也可以认为是一个观察者模式实现,或者事件-监听模式的实现,直接称disrup ...

  7. apache 服务器概述--安装(一)

    一.安装httpd,elinks浏览器 [root@ ~]# yum install elinks httpd -y [root@ ~]# elinks www.baidu.com 二.配置文件 # ...

  8. 代码部署工具walle(一)

    一.概述 代码部署上线.权限控制.一键版本回滚,github地址:https://github.com/meolu/walle-web walle是基于php语言做的,所以需要一个php的安装环境. ...

  9. springMVC和json整合配置方法

    一.配置方法一 1.导入第三方的jackson包,jackson-mapper-asl-1.9.13.jar和jackson-core-asl-1.9.13.jar 百度云链接:https://pan ...

  10. JDK并发包中ExecutorCompletionService使用

    相信大家都知道,jdk中ExecutorService是并发编程时使用很频繁的接口,并且使用很方便,那么想在有这么一个场景: 一批任务使用线程池处理,并且需要获得结果,但是不关心任务执行结束后输出结果 ...