JavaScript高级编程笔记(5)

离线应用/客户端存储

1.离线检测

(1)、 navigator.onLine 检测设备在线还是离线 (有兼容性问题)
(2)、 为了更好地确定网络是否可用,HTML5还定义了两个事件:onlineoffline 。网络在线变为离线或者离线变为在线时,分别触发这两个事件。
(3)、 为了检测应用是否离线,在页面加载后,最好先用navigator.onLine获取初始状态,然后通过上述两个事件来确定网络连接状态是否变化。

2.应用缓存

描述文件示例:

CACHE MANIFEST
#Comment

file.js
file.css

要将描述文件与页面关联起来,可以在<html>中的manifest属性中指定这个文件的路径,例如:

<html manifest="/offline.manifest">

以上代码告诉页面,/offline.manifest 中包含描述文件,这个文件的MIME类型必须是text/cache-manifest

应用缓存的核心是applicationCache 对象,这个对象有一个status属性,属性的值是常量.

表示应用缓存的如下当前状态
0(UNCACHED):  无缓存, 即没有与页面相关的应用缓存
1(IDLE): 闲置,即应用缓存未得到更新
2(CHECKING): 检查中,即正在下载描述文件并检查更新
3(DOWNLOADING): 下载中,即应用缓存正在下载描述文件中指定的资源
4(UPDATEREADY): 更新完成,所有资源都已下载完毕
5(IDLE):  废弃,即应用缓存的描述文件已经不存在了,因此页面无法再访问应用缓存
表示应用缓存状态改变的相关的事件
`checking` : 在浏览器为应用缓存查找更新时触发
`error` : 在检查更新或下载资源期间发送错误时触发
`noupdate` : 在检查描述文件发现文件无变化时触发
`downloading` : 在开始下载应用缓存资源时触发
`progress`:在文件下载应用缓存的过程中持续不断地下载地触发
`updateready` : 在页面新的应用缓存下载完毕触发
`cached` : 在应用缓存完整可用时触发

3.数据缓存

(1) Cookie

cookie限制:
  • IE 6 以及更低版本限制每个域名最多20个cookie.
  • IE7 和之后版本每个域名最多50个.
  • Firefox 限制每个域最多50个cookie.
  • Opera限制每个域最多30个cookie.
  • Safari和Chrome对于每个域的cookie数量限制没有硬性要求.

大多数浏览器都有大约4096bcookie长度限制.

cookie 由浏览器保存以下几块信息构成

  • 名称(name): 一个唯一确定cookie的名称。cookie名称是不区分大小写的,但实践中最好将该名字看作是区分大小写。
  • 值(value): 存储在cookies的字符串值.eg:(name=value)
  • 域: cookie对于哪个域是有效的。eg:(domain=.baidu.com)
  • 路径: 指定只能从某个域的路径才能访问cookie eg:(path=/)
  • 失效时间: cookie失效时间 eg:(expires=time)
  • 安全标志: 指定后,cookie只有在使用SSL连接的时候才发送到服务器.eg:(secure)

document.cookie 可以获取cookie.返回的是一系列由分号隔开的名值对,这个属性的独特之处在于它会因为使用方式不同而表现为不同的行为。

可以通过封装代码使得操作更为便捷.
子cookie

为了绕开浏览器的单域名下cookie数限制,一些开发人员使用了一种称为子cookie的概念.子cookie是存放在单个cookie中的更小段数据,也就是使用cookie值来存储多个名称值对儿。

子cookie最常见的格式如下所示:

name = name1 = value1 & name2 = value2 & name3 = value3 & name4 = value4 & name5 = value5
可以通过封装代码使得操作更为便捷.

(2) Web 存储机制

WebStorage的目的是客服由cookie带来的一些限制,当数据需要被严格控制在客户端上时,无需持续地将数据发回服务器。

WebStorage 的两个主要目标是:
  • 提供一种在cookie之外存储会话数据的途径;
  • 提供一种存储大量可以跨会话存在的数据的机制;

最初的WebStroage 规范包含了两种对象的定义: sessionStorageglobalStorage.

1.Storage类型

Storage类型提供最大的存储空间(因浏览器而异)来存储名值对儿.Storage的实例与其他对象类似,有如下方法:

  • clear():删除所有值;firefox中没有实现.
  • getItem(name):根据指定的名字name获取对应的值.
  • key(index):获得index位置处的值的名字.
  • removeItem(name):删除由name指定的名值对儿.
  • setItem(name, value):为指定的name设置一个对应的值.
    还可以用length属性来判断有多少名值对存放在Storage对象中.但无法判断对象中所有数据的大小.
2.sessionStorage类型

sessionStorage 对象存储特定于某个对话的数据,也就是该数据只保持到浏览器关闭。这个对象就像会话cookie,也会在浏览器关闭后消失.存储在sessionStorage中的数据可以跨越页面刷新而存在.
存储在sessionStorage中的数据只能由最初给对象存储数据的页面访问到,所以对多页面应用有限制.
因为sessionStorage对象其实是Storage的一个实例,所以可以使用setItem()或者直接设置新的属性来存储数据.

//存储数据
sessionStorage.setItem("name","Nicholas"); 
sessionStorage.book = "professional JavaScript";
//读取数据
var name = sessionStorage.getItem("name");
var book = sessionStorage.book;
//循环迭代sessionStorage的值
for (var key in sessionStorage){
  var value = sessionStorage.getItem(key);
}
3.globalStorage/localStorage类型

localStorage作为HTML5规范中持久保存客户端数据的方案取代了globalStorage.要访问同一个localStorage对象,页面必须来自同一个域名(子域名无效),使用同一种协议,在同一个端口上.

由于 localStorage 是 Storage 的实例,所以可以像使用 sessionStorage 一样来使用它。
存储在localStorage中的数据和存储在globalStorage中的数据一样,都遵循相同的规则:数据保留到通过JavaScript删除或者是用户清除浏览器缓存.

3.storage 事件

对Storage对象进行任何修改,都会在文档上触发Storage事件. 当通过属性或setItem()方法保存数据,使用delete操作符或removeItem()删除数据,或者调用clear()方法时,都会发生该事件。

这个事件event对象有以下属性:

  • domain: 发生变化的存储空间域名。
  • key: 设置或者删除的键名。
  • newValue: 如果是设置值,则是新值;如果是删除键,则是null。
  • oldValue: 键被更改之前的值。
4.限制

大部分桌面浏览器会设置每个来源5MB的限制. Chrome和Safari对来源的限制是2.5MB,而IOS版Safari和Android版WebKit的限制也是2.5MB.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容