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的相关知识尽在梦龙小站。

版权声明:本文博主原创文章。博客,未经同意不得转载。

时间: 2024-10-10 17:10:25

HTML5分析实战Web存储机制(Web Storage)的相关文章

HTML5实战与剖析之Web存储机制(Web Storage)

Web Storage是以Key-Value的形式进行数据持久性存储.Web Storage是为了克服由cookie带来的一些限制而产生的.当数据需要被严格控制在客户端上的时候,无须持续地将数据发回服务器.Web Storage的目标有两个:提供一种存储会话数据的路径;提供存储大量可以跨会话存在的数据的机制. 最初的Web Storage规范包含了两个对象的定义:sessionStorage对象和globalStorage对象.这两个对象在支持的浏览器中都是以window对象属性的形式存在,支持

Web存储机制

在应用cookie的时候,自己在想,有没有一种存储数据的方法不用像Cookie这样需要依赖于服务器运行,终于,今天看到了  js高程  Web存储机制的那一部分,好像打开了新世界的大门..... Web  Storage 的主要目标, 1,提供一种在Cookie之外存储会话数据的途径 2,提供一种存储大量可以跨会话存在的数据的机制 通过Storage类型来存储的名值对儿,有如下方法: 1.clear(),  删除所有值 2.getItem(),根据指定的名字name获取对应的值 3.key( i

Web存储机制—sessionStorage,localStorage使用方法

Web存储机制,在这里主要聊有关于Web Storage API提供的存储机制,通过该机制,浏览器可以安全地存储键值对,比使用cookie更加直观.接下来简单的了解如何使用这方面的技术. 基本概念 Web Storage 包含两种机制: sessionStorage为每一个给定的源维持一个独立的存储区域,该区域在页面会话期间可用(即只要浏览器处于打开状态,包括页面重新加载和恢复) localStorage同样的功能,但是在浏览器关闭,然后重新打开后数据仍然存在 这两种机制是通过Window.se

java-通过 HashMap、HashSet 的源码分析其 Hash 存储机制

通过 HashMap.HashSet 的源码分析其 Hash 存储机制 集合和引用 就像引用类型的数组一样,当我们把 Java 对象放入数组之时,并非真正的把 Java 对象放入数组中.仅仅是把对象的引用放入数组中,每一个数组元素都是一个引用变量. 实际上,HashSet 和 HashMap 之间有非常多相似之处,对于 HashSet 而言.系统採用 Hash 算法决定集合元素的存储位置,这样能够保证能高速存.取集合元素:对于 HashMap 而言.系统 key-value 当成一个总体进行处理

java-通过 HashMap、HashSet 的源代码分析其 Hash 存储机制

通过 HashMap.HashSet 的源代码分析其 Hash 存储机制 集合和引用 就像引用类型的数组一样,当我们把 Java 对象放入数组之时,并不是真正的把 Java 对象放入数组中,只是把对象的引用放入数组中,每个数组元素都是一个引用变量. 实际上,HashSet 和 HashMap 之间有很多相似之处,对于 HashSet 而言,系统采用 Hash 算法决定集合元素的存储位置,这样可以保证能快速存.取集合元素:对于 HashMap 而言,系统 key-value 当成一个整体进行处理,

web存储机制(localStorage和sessionStorage)

web存储包括两种:sessionStorage 和 localStorage(都是限定在文档源级别,非同源文档间无法共享) 1.sessionStorage 数据放在服务器上(IE不支持) 严格用于一个浏览器会话中存储数据,数据在浏览器关闭后会立即删除 2.localStorage 数据在客户端(低版本IE ( IE6, IE7 ) 不支持,并且不支持查询语言) 跨会话持久化地存储数据 localStorage与sessionStorage的区别: localStorage只要在相同的协议.相

比特币代码分析11 比特币存储机制

比特币存储机制 比特币存储系统由两部分组成: kv 数据库(levelDB)索引和普通数据文件.普通文件用于存储区块链数据,kv 数据库用于存储区块链元数据.用于存储区块链数据的普通文件以 blk00000.dat , blk00001.dat 文件名格式组成.其中 index 目录存储用于存储区块元数据.普通区块数据文件 为了快速检索区块数据,每个文件的大小是128 M Bytes.区块里的数据(区块头和区块里的所有交易)都会序列成字节码的形式写入 dat 文件中.在序列化的过程中,如果检测到

HTML5分析实战WebSockets基本介绍

HTML5 WebSockets规范定义了API,同意web使用页面WebSockets与远程主机协议的双向交流. 介绍WebSocket接口,并限定了全双工通信信道,通过套接字网络.HTML5 WebSockets而不能攀登的轮询和长轮询的解决方式是用来模拟全双工连接通过维护两个连接. HTML5 WebSockets账户代理和防火墙等网络危害,使得流媒体可以在不论什么连接,和可以支持在单个连接上游和下游的通信,HTML5 WebSockets-based应用程序server减轻负担,让现有的

EOS代码分析3 EOS存储机制的IPFS分布式文件系统

EOS使用IPFS分布式文件系统作为底层存储.IPFS是一种内容可寻址.点对点.通过http协议传输的分布式文件系统.IPFS采用content-addressable寻址技术,即通过文件内容进行检索而不是通过文件的网络地址.简单来说,就是对文件内容进行hash运算,将hash值作为文件名保存在本地数据库中,所以,只要文件内容不变,则文件名也保持不变.运行IPFS的节点,既是客户端又是服务器.客户端通过发送文件名到服务器,请求下载文件,服务器会根据文件名到数据库中查找对应的文件,查找成功后将文件