html5 - Storage 本地存储
Storage的解释 http://www.w3school.com.cn/html5/html_5_webstorage.asp
简单的理解就是:
Storage 有两种:
1、localStorage 永久性存储客户端、除非你删除、修改否则不会消失,存储的体积为5M (《HTML5程序设计》讲其实是可以超过5M只不过有的浏览器会提示有的则不提示.ps:我没测过书上说的)同时数据共享,也就说 其他页面也可以你访问到你存储的数据;
2、sessionStorage 临时性存储在客户端,只要你不关闭当前页面存数数据都在,数据不共享,其真正的用意是为了解决 cookie封堵数据泄露(简单说就是你在这个页面选择A选项 存到了cookie、你又开了同个页面选择B选项存到了cookie、回到A页面提交了选项 但cookie的值其实是B选项不是当前页面的A选项)
根据 jquery.cookie.js 编写了一个 Storage 的jquery 的简单粗鄙库,API 也是根据 cookie 编写:
$.isSession、$.isLocal 判断当前浏览器是否支持 Storage 两个属性的方法 支持为 true 不支持为undefined;
$.storage 存数本地数据的函数:三个参数 name、key、value 三个值 第一个参数为session、local 来分辨存储的是哪一种存储类型 第二参数为 存储的key 值 第三个参数为key对应的value值 如果 value 传的参数为‘’ 则视为删除这组key值,如果只传第一个参数为session、local则返回对应的原生对象 ,如果传了两个参数视为从本地存储里取key值的value,如果没有则返回undefined. 因为低版本的IE不支持Storage 会alert('This browser does NOT support Storage!'),建议如果做低版本的时候先用 $.isSession、$.isLoca 来判断一下客户端是否支持;
$.removeStorage 删除本地存数的key值:两个参数 第一个参数name 传参数session、local 一样分别删除哪种类型的本地存储,第二个参数key 为删除的key名,如果key传入的是‘clearAll’则视为清除全部对应本地存储的key值
$.wachStorage 为时时监控本地存储key的变化函数:一个参数为回调函数
(function (factory) {
if (typeof define === 'function' && define.amd) {
// AMD
define(['jquery'], factory);
} else if (typeof exports === 'object') {
// CommonJS
factory(require('jquery'));
} else {
// Browser globals
factory(jQuery);
}
}(function ($) {
function _isStorageText( name ){
if( name ==='session' || name === 'local' ){
return true;
}else{
return false;
}
}
var storageBrowser = {};
if( window.sessionStorage ){
storageBrowser.isStorage = true;
}
if( window.localStorage ){
storageBrowser.isLocal = true;
}
$.isSession = storageBrowser.isStorage;
$.isLocal = storageBrowser.isLocal;
$.storage = function( name,key,value ){
if( !$.isSession || !$.isLocal ){
alert( 'This browser does NOT support Storage!' );
return false;
}
if( arguments.length === 1 && !$.isFunction(name) && _isStorageText(name) ){
switch( name )
{
case 'session':
return window.sessionStorage ;
break;
case 'local':
return window.localStorage ;
break;
default:
}
}
if( arguments.length === 2 && !$.isFunction(name) && !$.isFunction(key) && _isStorageText(name) ){
switch( name )
{
case 'session':
return sessionStorage[ key ] ;
break;
case 'local':
return localStorage[ key ] ;
break;
default:
}
}
if( arguments.length === 3 && !$.isFunction(name) && !$.isFunction(key) && !$.isFunction(value) && _isStorageText(name) ){
switch( name )
{
case 'session':
if ( $.trim(value).length === 0 && !$.isFunction(value)) {
return sessionStorage.removeItem(key);
}else{
try {
return sessionStorage[ key ] = value;
}catch(e) {}
}
break;
case 'local':
if ( $.trim(value).length === 0 && !$.isFunction(value)) {
return localStorage.removeItem(key);
}else{
try {
return localStorage[ key ] = value;
}catch(e) {}
}
break;
default:
}
}
return false;
}
//删除localStorage 的key值;
$.removeStorage = function( name,key ){
if( arguments.length === 1 && !$.isFunction(name) && _isStorageText(name) ){
return false;
}
switch( name )
{
case 'session':
if( key === 'clearAll' ){
sessionStorage.clear();
return false;
}else{
return sessionStorage[ key ] ;
}
break;
case 'local':
if( key === 'clearAll' ){
localStorage.clear();
return false;
}else{
return localStorage[ key ] ;
}
break;
default:
}
}
//时时监听 Storage 的变化;
$.wachStorage = function( fn ){
if( window.addEventListener ){
window.addEventListener('storage',fn,true);
}else{
window.attachEvent('storage',fn);
}
}
}));
写了一个小小DEMO 数据同步:同时在服务端打开两个以上的页面查看在单页面选的喜欢的水果同步到另外几个相同页面(我没有做兼容,其实就是试试我写的小插件)。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
*{margin:0;padding:0;}
.cent{ width:950px; margin:0 auto;}
li{ list-style:none;}
</style>
<script src="jquery-1.7.2.min.js"></script>
<script src="jquery.storage.js"></script>
<script>
$(function(){ var $checkboxs = $('input:checkbox');
var $spans = $('span');
var $btn = $('#btn');
var $viwMian = $('#viwMian'); // 初始化 判断是否有存储过本地数据
StorageInit();
function StorageInit(){
fnStorage( function(){ if( $.storage('local','fruit') ){ var fruitArr = $.storage('local','fruit').split("&");
for( var j=0,len=fruitArr.length;j<len;j++ ){ for( var i=0,len=$spans.length;i<len;i++ ){ var spanVlue = $spans.eq(i).text(); if( spanVlue == fruitArr[j] ){ $spans.eq(i).prev().attr('checked','checked'); }
}
} } } );
} // 判断浏览器是否支持
function fnStorage( fn ){
if( $.isLocal ){ fn(); }
} //监控函数
function SyncFruit( e ){ if( e.key == 'fruit' ){ for( var i=0,len=$spans.length;i<len;i++ ){
$spans.eq(i).prev().attr('checked',false);
}
var newKey = e.newValue;
if( e.newValue ){ var fruitArr = e.newValue.split("&");
for( var j=0,len=fruitArr.length;j<len;j++ ){ for( var i=0,len=$spans.length;i<len;i++ ){ var spanVlue = $spans.eq(i).text(); if( spanVlue == fruitArr[j] ){ $spans.eq(i).prev().attr('checked','checked'); }
}
}
} }
} //调用的删除
//$.removeStorage('local','clearAll'); //监控的调用
$.wachStorage( SyncFruit ); //多选checkbox的点击事件
$checkboxs.on('click',function(){ var $this = $(this);
var value = $(this).next().text(); if( $this.attr('checked') == 'checked' ){ fnStorage(function(){ if( $.storage('local','fruit') ){ var fruitTxt = $.storage('local','fruit');
fruitTxt += '&'+value;
$.storage('local','fruit',fruitTxt); }else{ $.storage('local','fruit',value); } }); }else{ fnStorage(function(){ var fruitArr = $.storage('local','fruit').split("&");
for( var i=0,len=fruitArr.length;i<len;i++ ){ if( fruitArr[ i ] == value ){
fruitArr.splice(i,1);
} }
var fruitTxt = fruitArr.join("&"); $.storage('local','fruit',fruitTxt); }); }
}); // 确定的提交
$btn.on('click',function(){ fnStorage(function(){ var html = '',
arr = [];
$viwMian.html('');
if( $.storage('local','fruit') ){ var fruitArr = $.storage('local','fruit').split("&"); html += '我选择的有:<br/>'
for( var j=0,len=fruitArr.length;j<len;j++ ){ html+='<p>'+ fruitArr[j] +'</p>'; } $viwMian.append(html); } }); }); });
</script> </head>
<body>
<div class="cent">
<h2>
选出喜欢的水果(多选题):
</h2>
<ul>
<li>
<input type="checkbox"><span>草莓</span>
</li>
<li>
<input type="checkbox"><span>苹果</span>
</li>
<li>
<input type="checkbox"><span>香蕉</span>
</li>
<li>
<input type="checkbox"><span>鸭梨</span>
</li>
<li>
<input type="checkbox"><span>桃子</span>
</li>
<li>
<input type="checkbox"><span>火龙果</span>
</li>
</ul>
<input type="button" value="确认" id="btn"><br/><br/>
<div id="viwMian"> </div>
</div> </body>
</html>
后记:
原本想在做了Storage 的 length 属性 查看存数的个数,后来觉得没啥太大用。。。。
这个小插件写的有点代码繁琐,我感觉还可以在简练一些,不过没想到更好的方式,如果有大神有好方法请告知;
html5 - Storage 本地存储的更多相关文章
- HTML5 LocalStorage 本地存储
HTML5 LocalStorage 本地存储 说到本地存储,这玩意真是历尽千辛万苦才走到HTML5这一步,之前的历史大概如下图所示: 最早的Cookies自然是大家都知道,问题主要就是太小,大概也就 ...
- (转载)HTML5 LocalStorage 本地存储
原文地址:http://www.cnblogs.com/xiaowei0705/archive/2011/04/19/2021372.html HTML5 LocalStorage 本地存储 说到本地 ...
- HTML5的本地存储 LocalStorage
localStorage顾名思义,就是本地存储的意思,在以前很长一段时间,要想在客户端存 储一些配置及登录信息等数据都只能通过COOKIE或flash的方式,如今html5来临,也 带来了更强大的本地 ...
- 【转】HTML5 LocalStorage 本地存储
原文见:http://www.cnblogs.com/xiaowei0705/archive/2011/04/19/2021372.html 说到本地存储,这玩意真是历尽千辛万苦才走到HTML5这一步 ...
- html5的本地存储localStorage和sessionStorage
html5的本地存储localStorage和sessionStorage html5中新增的比较重要的一个功能就是web storage来实现客户端本地存储数据,之前存储数据都是用cookie来实现 ...
- HTML5 LocalStorage 本地存储总结
存储数据的方法就是直接给window.localStorage添加一个属性,例如:window.localStorage.a 或者 window.localStorage["a"] ...
- HTML5 LocalStorage 本地存储(转)
原文:http://www.cnblogs.com/xiaowei0705/archive/2011/04/19/2021372.html HTML5 LocalStorage 本地存储 说到本地存储 ...
- Sencha Touch 2 结合HTML5的本地存储创建数据库实现增、删、改、查
大家好!我是范范.本人刚接触ST2到现在刚刚两个月,6月1号接的项目,那时才知道有Sencha Touch2这个东西,到现在两个月了期间的幸酸就不说了.今天说说在项目中用到的HTML5的本地存储.可能 ...
- sessionStorage html5客户端本地存储之sessionStorage及storage事件
可以看一下<JavaScript本地存储实践(html5的localStorage和ie的userData)>sessionStorage和上文中提到的localStorage非常相识,方 ...
随机推荐
- 解决pycharm启动慢
xms -xmx相关参数设置 打开pycharm的安装目录 D:\PyCharm\PyCharm 2018.2.3\bin下文件pycharm.exe.vmoptions修改默认(版本2016.2)的 ...
- 【leetcode-66】 加一
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一. 最高位数字存放在数组的首位, 数组中每个元素只存储一个数字. 你可以假设除了整数 0 之外,这个整数不会以零开头. 示例 1: 输入 ...
- mysql表基本查询
第一节 -- or # 单行注释/***多行注释*/ -- c创建数据库examCREATE DATABASE exam; USE exam; /*创建部门表*/CREATE TABLE dept( ...
- Android 常见异常及解决办法
Ø 前言 本文主要记录 Android 的常见异常及解决办法,以备以后遇到相同问题时可以快速解决. 1. java.lang.NullPointerException: Attempt to i ...
- 二十七、Linux 进程与信号---进程组和组长进程
27.1 进程组 27.1.1 进程组介绍 进程组为一个或多个进程的集合 进程组可以接受同一终端的各种信号,同一个信号发送进程组等于发送给组中的所有进程 每个进程组有唯一的进程组 ID 进程组的消亡要 ...
- Python安全 - 从SSRF到命令执行惨案
前两天遇到的一个问题,起源是在某个数据包里看到url=这个关键字,当时第一想到会不会有SSRF漏洞. 以前乌云上有很多从SSRF打到内网并执行命令的案例,比如有通过SSRF+S2-016漏洞漫游内网的 ...
- springboot04-mongodb
1.搭建mongodb服务 在https://www.mongodb.com/下载mongodb安装包,解压到本地 cmd中执行命令,启动本地mongodb: cd D:\Program Files\ ...
- T-SQL常见基础疑点问答总结
--建立测试环境 IF object_id('tb') IS NOT NULL DROP TABLE tb GO ,),v )) GO INSERT tb SELECT 'a' UNION ...
- nginx 相关命令
验证配置是否正确: nginx -t 查看Nginx的版本号:nginx -V 启动Nginx:start nginx 快速停止或关闭Nginx:nginx -s stop 正常停止或关闭Nginx: ...
- lua与C/C++交互概要
转 http://blog.csdn.net/wildfireli/article/details/22307635 Lua生来就是为了和C交互的,因此使用C扩展Lua或者将Lua嵌入到C当中都是非常 ...