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 本地存储的更多相关文章

  1. HTML5 LocalStorage 本地存储

    HTML5 LocalStorage 本地存储 说到本地存储,这玩意真是历尽千辛万苦才走到HTML5这一步,之前的历史大概如下图所示: 最早的Cookies自然是大家都知道,问题主要就是太小,大概也就 ...

  2. (转载)HTML5 LocalStorage 本地存储

    原文地址:http://www.cnblogs.com/xiaowei0705/archive/2011/04/19/2021372.html HTML5 LocalStorage 本地存储 说到本地 ...

  3. HTML5的本地存储 LocalStorage

    localStorage顾名思义,就是本地存储的意思,在以前很长一段时间,要想在客户端存 储一些配置及登录信息等数据都只能通过COOKIE或flash的方式,如今html5来临,也 带来了更强大的本地 ...

  4. 【转】HTML5 LocalStorage 本地存储

    原文见:http://www.cnblogs.com/xiaowei0705/archive/2011/04/19/2021372.html 说到本地存储,这玩意真是历尽千辛万苦才走到HTML5这一步 ...

  5. html5的本地存储localStorage和sessionStorage

    html5的本地存储localStorage和sessionStorage html5中新增的比较重要的一个功能就是web storage来实现客户端本地存储数据,之前存储数据都是用cookie来实现 ...

  6. HTML5 LocalStorage 本地存储总结

    存储数据的方法就是直接给window.localStorage添加一个属性,例如:window.localStorage.a 或者 window.localStorage["a"] ...

  7. HTML5 LocalStorage 本地存储(转)

    原文:http://www.cnblogs.com/xiaowei0705/archive/2011/04/19/2021372.html HTML5 LocalStorage 本地存储 说到本地存储 ...

  8. Sencha Touch 2 结合HTML5的本地存储创建数据库实现增、删、改、查

    大家好!我是范范.本人刚接触ST2到现在刚刚两个月,6月1号接的项目,那时才知道有Sencha Touch2这个东西,到现在两个月了期间的幸酸就不说了.今天说说在项目中用到的HTML5的本地存储.可能 ...

  9. sessionStorage html5客户端本地存储之sessionStorage及storage事件

    可以看一下<JavaScript本地存储实践(html5的localStorage和ie的userData)>sessionStorage和上文中提到的localStorage非常相识,方 ...

随机推荐

  1. javascript的作用域和闭包(三)闭包与模块

    一些很重要的说明:前面三篇博客详细的介绍了,引擎与编译器和作用域的关系,重点需要理解的是编译器中的分词与词法分析,JavaScript的特有的“赋值操作的左右侧”引用操作:编译阶段的词法作用域的工作原 ...

  2. HDU - 6311 Cover(无向图的最少路径边覆盖 欧拉路径)

    题意 给个无向图,无重边和自环,问最少需要多少路径把边覆盖了.并输出相应路径 分析 首先联通块之间是独立的,对于一个联通块内,最少路径覆盖就是  max(1,度数为奇数点的个数/2).然后就是求欧拉路 ...

  3. 自学python 4.

    1.li = ["alex","tom","mike","god","merffy"](1)a = ...

  4. 向量空间模型(Vector Space Model)的理解

    1. 问题描述 给你若干篇文档,找出这些文档中最相似的两篇文档? 相似性,可以用距离来衡量.而在数学上,可使用余弦来计算两个向量的距离. \[cos(\vec a, \vec b)=\frac {\v ...

  5. 关于公众平台接口不再支持HTTP方式调用的公告

    为保证数据传输安全,提高业务安全性,公众平台将不再支持HTTP方式调用.避免影响正常使用中含有HTTP方式调用的服务,请开发者尽快调整,将现有通过HTTP方式调用的切换成HTTPS调用,平台将于201 ...

  6. tcp_listen函数

    #include <netdb.h> #include <unistd.h> #include <stddef.h> #include <strings.h& ...

  7. Django之CRM项目Day5-跳转页面 跟进记录 报名记录

    1 编辑和添加后跳转页面: 思路:写一个参数将路径的条件带上 注意:捋流程的时候从urls里开始 1.在crm文件夹下新建python包:templatetags,在包里新建url.py: from ...

  8. Hbase配置WEB UI界面

    1 找到各个节点下面的Hbase-site.xml文件,添加如下配置 <property> <name>hbase.master.info.port</name> ...

  9. Android RecyclerView 瀑布流滑动到最后自动加载更多

    mRecycleView.setOnScrollListener(new RecyclerView.OnScrollListener(){ //用来标记是否正在向最后一个滑动,既是否向下滑动 bool ...

  10. Palindromic Numbers LightOJ - 1205

    题目大意: 求区间内的回文数个数 题目思路: 数位dp,先枚举前一半数字,然后填上相应的后一半数字. #include<cstdio> #include<cstring> #i ...