JavaScript 离线应用和客户端存储

支持离线Web应用开发是HTML5的一个重点

离线检测

navigator.onLine 不同浏览器下不同,IE6+ Safari5+能正确识别网络已经断开,并将navigator.onLine设置为false;Firefox3+和Opera 10.6+ 需要手动去设置脱机工作,为了确定网络是否可用,HTML5还定义了两个事件,online和offline
为了检测应用是否离线,最好再页面加载后,先调用navigator.onLine获取初始状态,然后通过上面的两个事件来确定网络链接状态是否发生变化

应用缓存

HTML5的应用缓存简称为appcache,是从浏览器缓存中分出来的一块缓存区,要想在这个缓存区保存数据,可以利用manifaset file 来列出要下载和缓存的资源,
简单的描述文件

CACHE MANIFEST
#Comment
xxx.css
xxx.js

可以在<html manifest="xxx.appcache"> 来找描述文件,文件的MIME类型必须是text/cache-manifest,原先的描述文件扩展名推荐manifest,现在推荐是appcache

applicationCache 有个对象status属性,让你知道缓存的当前状态

0: 无缓存
1:闲置,缓存未得到更新
2: 检查中,正在下载描述文件并检查更新
3:下载中
4: 下载完成
5: 废弃,缓存不存在了
//还有很多表示状态改变的事件
checking/error/noupdate/downloading/progress/updateready/cache

一般这些事件会随着页面加载按上述顺序依次发生,不过通过调用update()方法可以手工干预,让应用缓存为检查更新而触发上述事件,调用update()就会触发checking事件去检查描述文件是否更新。如果触发updateready事件,则说明新版本的应用缓存已经可用,此时你需要调用swapCache()来启用新应用缓存

数据存储

Cookie

最初是在客户端用于存储会话信息的该标准要求服务器对任意的HTTP请求发送Set-Cookie HTTP头作为响应的一部分,其中包括会话信息。
服务器响应的头肯如下

HTTP/1.1 200 ok
Content-type: text/html
Set-Cookie: name=value
Other-header: other-header-value

名称和值在传送的时候必须是URL编码,浏览器会存储这个信息,通过为每个请求添加Cookie HTTP头将信息发送回服务器,如下

GET /index.html HTTP/1.1
Cookie: name=value
Other-header:other-header-value

限制:cookie在性质上是绑定在特定的域名下,当设定一个cookie后,再给创建它的域名发送请求都会包含这个cookie。这个限制保存了存储的cookie中的信息只能让批准的接受者访问,而无法被其它域访问
IE6 及之前限制每个域名20个cookie,IE7+ 对多50个cookie,Firefox最多支持50个,Opera最大30个,Safari和Chrome没有硬性的规定,浏览器对cookie的尺寸也有限制,为了最佳的浏览器兼容性最好将整个cookie的长度限制在4095B内

cookie的构成:

名称: 不区分大小写,实践中还是看作是区分大小写的,因为有些服务器对cookie的名称经过URL编码
值: 值必须是URL编码的
域: 对于那个域是有效的,所有向该域发送的请求都会包含这个cookie信息,这个值可以包含子域,也可以不包含它,没有明确设定时,那么这个域就是来自设置cookie的那个域
路径: 对于指定域中的那个路径应该向服务器发送cookie
失效时间: 表示cookie何时被删除,默认情况下会话结束立马删除cookie,不过自己也可以设置删除的时间,这个值是个GMT格式的日期,(Wdy,DD-Mon-YYYY HH:MM:SS GMT)
安全标志: 指定后,cookie只能在使用SSL连接的时候才能发送到服务器

JavaScript中的cookie
document.cookie 返回当前页面可用的cookie,是一系列分号隔开的名值对name=value;name=value;...
所有的名和值都是经过URL编码的encodeURIComponent()

子cookie
是存放在单个cookie中更小段的数据,name=value&name=value&...

Web存储机制

Web Storage的目的是客服由cookie带来的一些限制
提供一种在cookie之外存储会话数据的途径,提供一种可以存储大量可以跨会话存在的数据机制
包含了两种对象定义sessionStoragelocalStorage,原先的globalStorage被HTML5中的localStorage取代了
有下列的方法clear()/getItem(name)/key(index)/removeItem(name)/setItem(name,value)
sessionStorage: 该对象存储特定于某个会话数据,也就是该数据只保持到浏览器关闭,类似于cookie,因为该对象绑定于某个服务器对话,所以当文件在本地运行的时候是不可用的,存储在sessionStorage中的数据只能由最初给对象存储数据的页面访问,对多个页面的应用有限制
localStorage:持久保存客户端数据的方案,取代了globalStorage,数据保留到通过JavaScript删除或者用户清除浏览器缓存

IndexedDB
在浏览器保存结构化数据的一种数据库,使用对象保存数据,而不是使用表来保存数据,

var request = indexDB.open('xxx');
request.onerror = function(){}
request.onsuccess = function(event){ database= event.target.result;}

db.createObjectStore('xx','xx'); //对象存储空间
db.transaction('xx'); //访问对应的存储空间
对象存储空间.openCursor();//使用游标查询

猜你喜欢

转载自blog.csdn.net/u013270347/article/details/81017190