HTML5分析实战Web存储机制(Web Storage)
Web Storage它是Key-Value在持久性数据存储的形式。Web Storage为了克服cookie把所引起的一些限制。当数据需要严格格控制client准时,没有必要不断地发回数据server。
Web Storage有两个目的:提供一种存储会话数据的路径;提供存储大量能够跨会话存在的数据的机制。
最初的Web Storage规范包括了两个对象的定义:sessionStorage对象和globalStorage对象。这两个对象在支持的浏览器中都是以window对象属性的形式存在。支持sessionStorage属性和globalStorage属性的浏览器有:Firefox 3.5+、Opera 10.5+、Chrome 4+和IE 8+。
当中Firefox 2和Firefox 3基于早期规范的内容部分实现了Web Storage。当时仅仅实现了globalStorage。没有实现localStorage。
1、Storage 类型
Storage类型提供了最大的存储空间(因浏览器而异)来存储名值对儿。
Storage的实例与其它对象类似,有以下几种方法。
clear():删除全部值,Firefox中不支持。
gitItem(name):依据指定的名字(name)获取相应的值。
key(index):获得index位置处的值的名字(name)。
removeItem(name):删除由name指定的名值对儿。
setItem(name, value):为指定的name设置一个相应的值。
当中getItem()、removeItem(name)和setItem(name, value)方法能够直接调用,也能够通过Storage对象间接调用。由于每一个项目都是作为属性存储在该对象上的,所以能够通过点语法或者方括号语法訪问属性来读取值。
设置一样,或者通过delete操作符进行删除。只是,最好是用法进行调用而不是属性来訪问数据,以免重写对象造成的报错。
还能够使用length属性来推断有多少名值对儿放在storage对象中。但无法推断对象中全部数据的大小。Storage类型仅仅能存储字符串。非字符串的数据在存储之前会被转成字符串。
2、globalStorage对象
早在Firefox 2中就实现了globalStorage对象。
这个对象存在的目的就是为了跨越会话存储数据而生的,可是有特定的訪问限制。要使用globalStorage对象,首先要指定哪些与能够訪问该数据。
能够通过方括号标记使用属性。小样例例如以下
JavaScript代码
//保存数据
globalStorage["www.leemagnum.com"].name = "leemagnum"; //获取数据
var name = globalStorage["www.leemagnum.com"].name; alert(name) //leemagnum
上面的样例必须在www.leemagnum.com域名以下才干訪问到,并且仅仅支持火狐3.6+。在这里,訪问的是针对”www.leemagnum.com”的存储空间。globalStorage对象不是Storage的实例,而详细的globalStorage[”www.leemagnum.com”]才是。这个存储空间对于”www.leemagnum.com”及其全部子域都能够訪问。某些浏览器同意更加宽泛的訪问限制,比方仅仅依据顶级域名进行限制或者同意全局訪问,小样例例如以下。
JavaScript代码
globalStorage["leemagnum.com"].name = "leemagnum1";
globalStorage["com"].name = "leemagnum2";
globalStorage[""].name = "leemagnum3";
上面这样是不支持的,无论是怎么訪问。都是不支持的。由于涉及到安全问题,所以不支持上面的方法。
当使用globalStorage对象的时候一定要制定域名。
对于globalStorage对象空间的訪问,是根据发起请求的页面的域名、协议和port来限制的。
比如比方使用HTTPS协议在”leemagnum.com”中存储了数据,那么通过HTTP訪问的”leemagnum.com”页面是不能訪问到这个数据的。通过80port訪问的页面无法与统一域名相同协议不同port訪问的页面共享数据的。
globalStorage对象的每一个属性都是Storage的实例。怎样使用就看以下的小样例吧
JavaScript代码
globalStorage["www.leemagnum.com"].name = "leemagnum";
globalStorage["www.leemagnum.com"].age = "12"; //删除数据
globalStorage["www.leemagnum.com"].removeItem("name"); //获取数据
var age = globalStorage["www.leemagnum.com"].getItem("age");
假设你实现不能确定域名。那么能够使用location.host作为属性名比較安全。
小样例例如以下
JavaScript代码
//保存数据
globalStorage[location.host].name = "leemagnum"; //获取数据
var age = globalStorage[location.host].getItem("age");
假设不使用removeItem()或者delete删除,或者用户未清除浏览器缓存。存储在globalStorage属性中的数据会一直保留在磁盘上。
这让globalStorage很适合在client存储文档或者长期保存用户偏好设置很有用。
3、localStorage对象
localStorage对象在HTML5规范中代替了globalStorage对象。与globalStorage对象不同的是,localStorage对象不能指定不论什么訪问规则。
localStorage訪问规则事先就设定好了。
要訪问同一个localStorage对象,页面必须来自同一个域名(子域名无效),必须使用同一种协议,在同一个port上。这相当于globalStorage[location.host]。
由于localStorage对象是Storage的实例。所以能够像使用sessionStorage对象一样来使用它。小样例例如以下。
JavaScript代码
//用法存储数据
localStorage.setItem("name", "leemagnum"); //使用属性存储数据
localStorage.age = "12"; //用法读取数据
var name = localStorage.getItem("name"); //使用属性读取数据
var age = localStorage.age;
存储在localStorage对象中的数据和存储在globalStorage对象中的数据一样。都遵循一样的规则。数据保留到通过JavaScript删除或者用户清除浏览器缓存。为了兼容仅仅支持globalStorage的浏览器,能够使用一下函数。
JavaScript代码
function getLocalStorage (){
if(typeof localStorage == "object"){
return localStorage;
}else if(typeof globalStorage == "object"){
return globalStorage[location.host];
}else{
alert("你的浏览器不支持高级存储")
}
}
然后,像以下这样调用一次这个函数,就能够正常读写数据了。
JavaScript代码
var storage = getLocalStorage();
在确定了使用哪个Storage对象之后,就能在全部支持Web Storage的浏览器中使用同样的存取规则操作数据了。
4、sessionStorage对象
sessionStorage对象像会话cookie仅仅保持到浏览器关闭。
存储在sessionStorage中的数据能够跨越页面刷新而存在,同事假设浏览器支持。浏览器崩溃并重新启动之后依旧可用(Firefox和Webkit都支持。IE不支持)。
由于sessionStorage对象绑定于某个server对话,所以当文件在本地执行的时候不可用。
存储在sessionStorage中的数据仅仅能通过最初给对象存储数据的页面訪问到。所以对多个页面应用是有限制的。
因为sessionStorage对象事实上是Storage的一个实例,所以使用setItem()或者直接设置新的属性来存储数据。
以下是存数数据的小样例
JavaScript
//用法存数数据
sessionStorage.setItem("name", "leemagnun"); //使用属性存储数据
sessionStorage.age = "12";
不同浏览器写入数据方面是不同的。Firefox和Webkit实现了同步写入,所以加入到存储空间中的数据是立马被提交的。
而IE的实现则是异步写入数据,所以在设置数据和将数据实现写入磁盘直接可能有一些延迟。对于少量数据而言,这个差异能够忽略的。对于大量数据。IE会比其它浏览器的速度会快一些。
在IE8中能够强制把数据写入磁盘:在设置数据之前使用begin()方法。而且在全部设置完毕之后调用commit()方法。小样例例如以下
JavaScript代码
//仅仅适用于IE8
sessionStorage.begin();
seesionStorage.name = "leemagnum";
sessionStorage.age = "12";
sessionStorage.commit();
这段代码确保了name和book的值在调用commit()之后立马被写入磁盘。
调用begin()方法是为了确保在这段代码运行的时候不会发生其它磁盘写入操作。
对于少量数据来说,这个过程并非必需的;可是对于大量数据而言。这方法是必需考虑的了。
sessionStorage对象中有数据时。能够用getItem()方法或者通过直接訪问属性名来获取数据。小样例例如以下
JavaScript代码
//用法存数数据
sessionStorage.setItem("name", "leemagnun"); //使用属性存储数据
sessionStorage.age = "12";
上面代码便利sessionStorage中的名值对儿的流程是这种:首先通过key()方法获取指定位置上的名字。然后通过getItem()方法找出相应这个名字的值。通过上面的for循环能够得到sessionStorage中的值也能够用for-in循环得到。小样例例如以下
JavaScript代码
//用法存数数据
sessionStorage.setItem("name", "leemagnun"); //使用属性存储数据
sessionStorage.age = "12"; var value = sKey ="";
for(i=0; i<sessionStorage.length; i++){
sKey = sessionStorage.key(i);
value = sessionStorage.getItem(sKey);
}
alert(sKey + " = " + value) //name = leemagnum
每次经过循环的时候,key被设置为sessionStorage中下一个名字。此时不会返回不论什么内置方法或者length属性。
要从sessionStorage对象中删除数据能够使用delete操作符删除对象属性,也能够调用removeItem()方法。小样例例如以下。
JavaScript代码
//使用for-in方法
var value = "";
for (var i in sessionStorage) {
value = sessionStorage.getItem(i);
}
alert(i + " = " + value) //name = leemagnum
可是。在Webkit中delete操作符有可能会失效,所以要运用removeItem()方法比較妥当。
sessionStorage对象应该主要用于只针对会话的小段数据的存储。假设须要跨越会话存储数据,那么globalStorage对象或者localStorage对象比較适合。
5、Storage事件
对Storage对象进行不论什么改动,都会在文档上触发storage事件。通过属性或者setItem()方法保存数据,使用delete操作符或者removeItem()方法删除数据。或者调用clear()方法时,都会发生storage事件。
Storage事件的event对象的属性有下面几个:
domain:发生变化的存储空间的域名。
key:设置或者删除的键名
newValue:假设是设置值则是新值;假设是删除键则是null
oldValue:键被更改之前的值。
在这四个事件中。IE8和Firefox仅仅实现了domain事件。
老版本号的Webkit也不支持storage事件。storage事件的监听方法例如以下
JavaScript代码
document.addEventListener('storage',function(event){
alert("发生变化的存储空间的域名是: " + event.domain);
}, false);
不管是对sessionStorage对象、globalStorage对象还是localStorage对象进行操作,都会触发storage事件,但没有区分。
6、限制
Web Storage与其它client数据存储方案类似。Web Storage相同也有限制。这些限制因浏览器而异。
大多数都是对存储空间大小的限制是用每一个来源(协议、域和port)为单位的。也就是说每一个来源都有固定大小的空间用于保存自己的数据。
对于localStorage对象来说,大多数桌面浏览器会设置每一个来源5MB的限制。Chrome和Safari对每一个来源的限制都是2.5MB。
而iOS版Safari和Android版Webkit的限制也是2.5MB。
对于sessionStorage对象的限制也是因浏览器而异的。
有的浏览器对sessionStorage对象的大小没有限制。可是Safari、Chrome、iOS版Safari和Android版Webkit都有限制,都是2.5MB。
IE8+和Opera对sessionStorage对象的限制是5MB。
7、支持情况
Web Storage在浏览器中的支持情况:IE8+、Firefox 3.5+、Chrome 4.0+、Opera 10.5+、Android版Webkit和iOS版Safari。
8、综合小样例
HTML代码
<div style="border: 2px dashed #ccc;width:320px;text-align:center;">
<label for="user_name">姓名:</label>
<input type="text" id="user_name" name="user_name" class="text"/>
<br/>
<label for="mobilephone">手机:</label>
<input type="text" id="mobilephone" name="mobilephone"/>
<br/>
<input id="add" type="button" value="新增记录"/>
<hr/>
<label for="search_phone">输入手机号:</label>
<input type="text" id="search_phone" name="search_phone"/>
<input id="find" type="button" value="查找机主"/>
<p id="find_result"><br/></p>
<input id="delete" type="button" value="清除全部数据"/>
</div>
<br/>
<div id="list">
</div>
JavaScript代码
window.onload = function(){
var oAdd = document.getElementById("add"),
oFind = document.getElementById("find"),
oDelete = document.getElementById("delete");
//保存数据
oAdd.onclick = function(){
var mobilephone = document.getElementById("mobilephone").value;
var user_name = document.getElementById("user_name").value;
localStorage.setItem(mobilephone,user_name);
}
//查找数据
oFind.onclick = function(){
var search_phone = document.getElementById("search_phone").value;
var name = localStorage.getItem(search_phone);
var find_result = document.getElementById("find_result");
find_result.innerHTML = search_phone + "的机主是:" + name;
}
//清除全部数据
oDelete.onclick = function(){
localStorage.clear();
loadAll()
};
//将全部存储在localStorage中的对象提取出来。并展现到界面上
loadAll()
function loadAll(){
var list = document.getElementById("list");
if(localStorage.length>0){
var result = "<table border='1'>";
result += "<tr><td>姓名</td><td>手机号码</td></tr>";
for(var i=0;i<localStorage.length;i++){
var mobilephone = localStorage.key(i);
var name = localStorage.getItem(mobilephone);
result += "<tr><td>"+name+"</td><td>"+mobilephone+"</td></tr>";
}
result += "</table>";
list.innerHTML = result;
}else{
list.innerHTML = "眼下数据为空,赶紧開始增加联系人吧";
}
}
};
HTML5实战与剖析之Web存储机制(Web Storage)就为大家介绍完了。Web Storage是进行数据持久性存储的。Web Storage是为了克服由cookie带来的一些限制而产生的。
Web Storage的产生算是一次数据存储的革命。
很多其它有关HTML5的相关知识尽在梦龙小站。
版权声明:本文博主原创文章。博客,未经同意不得转载。
HTML5分析实战Web存储机制(Web Storage)的更多相关文章
- Web存储机制—sessionStorage,localStorage使用方法
Web存储机制,在这里主要聊有关于Web Storage API提供的存储机制,通过该机制,浏览器可以安全地存储键值对,比使用cookie更加直观.接下来简单的了解如何使用这方面的技术. 基本概念 W ...
- java-通过 HashMap、HashSet 的源码分析其 Hash 存储机制
通过 HashMap.HashSet 的源码分析其 Hash 存储机制 集合和引用 就像引用类型的数组一样,当我们把 Java 对象放入数组之时,并非真正的把 Java 对象放入数组中.仅仅是把对象的 ...
- web存储机制(localStorage和sessionStorage)
web存储包括两种:sessionStorage 和 localStorage(都是限定在文档源级别,非同源文档间无法共享) 1.sessionStorage 数据放在服务器上(IE不支持) 严格用于 ...
- kafka知识体系-kafka设计和原理分析-kafka文件存储机制
kafka文件存储机制 topic中partition存储分布 假设实验环境中Kafka集群只有一个broker,xxx/message-folder为数据文件存储根目录,在Kafka broker中 ...
- HTML5客户端数据存储机制Web Storage和Web SQL Database
引言 html5本地存储可以选择两种方式,一种是本地存储,一种是sqlite. 比如开发html5的购物车功能,就可以考虑选择其中之一,进行本地存储与操作. 又或者保存用户登录信息,可以使用local ...
- 23.3.3 Web存储机制【JavaScript高级程序设计第三版】
Web Storage 最早是在Web 超文本应用技术工作组(WHAT-WG)的Web 应用1.0 规范中描述的. 这个规范的最初的工作最终成为了HTML5 的一部分.Web Storage 的目的是 ...
- HTML5分析实战WebSockets基本介绍
HTML5 WebSockets规范定义了API,同意web使用页面WebSockets与远程主机协议的双向交流. 介绍WebSocket接口,并限定了全双工通信信道,通过套接字网络.HTML5 We ...
- HTML5分析实战WebSockets一个简短的引论
HTML5 WebSockets规范定义了API,同意web页面使用WebSockets与远程主机协议的双向通信. 介绍WebSocket接口,并限定了全双工通信信道,通过套接字网络. HTML5 W ...
- HashMap、HashSet源代码分析其 Hash 存储机制
集合和引用 就像引用类型的数组一样,当我们把 Java 对象放入数组之时,并不是真正的把 Java 对象放入数组中,只是把对象的引用放入数组中,每个数组元素都是一个引用变量. 实际上,HashSet ...
随机推荐
- Guest与virtio netdev交互模式
Qemu为virtio设备分配了专门的pci设备ID,device IDs (vendor ID 0x1AF4) from 0x1000 through 0x10FF,而pci子系统中的厂商ID和设备 ...
- Java知多少(4)J2SE、J2EE、J2ME的区别
原文:Java知多少(4)J2SE.J2EE.J2ME的区别 1998年12月,SUN公司发布了Java 1.2,开始使用“Java 2” 这一名称,目前我们已经很少使用1.2之前的版本,所以通常所说 ...
- CentOS6.5设备MRBS
//--------------------------------------软件必须安装-----------------------------------// # yum install –y ...
- codeforces #550E Brackets in Implications 结构体
标题效果:定义集合中{0,1}\{0,1\}上的运算符"→\rightarrow",定义例如以下: 0→0=10\rightarrow 0=1 0→1=10\rightarrow ...
- TCMalloc 安装与使用
TCMalloc 安装和使用 Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csdn.net/chen19870707 Da ...
- JAVA在IO流量汇总
本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/42119261 我想你对JAVA的IO流有所了解,平时使用的 ...
- hdu 5106 Bits Problem(数位dp)
题目链接:hdu 5106 Bits Problem 题目大意:给定n和r,要求算出[0,r)之间全部n-onebit数的和. 解题思路:数位dp,一个ct表示个数,dp表示和,然后就剩下普通的数位d ...
- 第二章 自己的框架WMTS服务,下载数据集成的文章1
在构建数据源下载文件的叙述性说明第一步 如此XML结构体 <?xml version="1.0" encoding="utf-8"?> <on ...
- STL 清除模板容器 clear.h
#pragma once #include "GeometricMacro.h" #include "GeometricEnum.h" #include &qu ...
- 中文乱码?不,是 HTML 实体编码!(转)
在 如何用 Nodejs 分析一个简单页面 一文中,我们爬取了博客园首页的 20 篇文章标题,输出部分拼接了一个字符串: var $ = cheerio.load(sres.text); var an ...