html5本地存储 以及 离线应用

本周在做项目的时候,用到了 sessionStorage 来存储来自上游页面用户输入的手机号码,所以总结了一下html5存储相关~

(一)html5之前的存储方式

(1)使用cookies存储:

其特点如下:

1)http请求头上会带着:如果数据多的话,会显得臃肿

2)大小4K:放置的数据不能超过4K

3)主domain污染:容易产生安全隐患

(2)userData:只有IE支持,存放到 XML文件里

(二)html5存储需要解决的问题

1. 解决4K 大小的问题

2. 解决请求头常带存储信息的问题 (弊端:不安全、请求慢)

3. 跨浏览器(跨平台)

4. 解决关系型存储的问题

(三)html5的几种存储方式

(1)本地存储:localStorage 和 sessionStorage

(2)离线缓存:application cache

(3)关系型:IndexDB 和 web SQL

3.1 localStorage: 

localStorage 的有效期是永久,除非手动删除 否则将会一直存在于浏览器中。

存储大小约为5M,仅仅存在于客户端中,不参与服务端的通信。

用法:

1)设置值:

localStorage.setItem(key, value)
// 例子
localStorage.setItem('name', 'zhoufangbing')

2)取值:

localStorage.getItem(key)
// 例子
var name = localStorage.getItem('name')
console.log(name) // zhoufangbing

3) 删除某个值:

localStorage.removeItem(key)
// 例子
localStorage.removeItem('name')
var name = localStorage.getItem('name')
console.log(name) // null 为空

4)清空所有值:

localStorage.clear()

在 console 控制台里面 设置也同样生效~

3.2  sessionStorage:

用法跟 localStorage 一样,就不多重复说啦~

区别:

sessionStorage 的仅在当前会话下有效,关闭浏览器 、关闭页面 或者 重新打开一个新页面 就会被清除~刷新当前页面不会被清除

在控制台里面测试一下~

本地存储可以存什么数据呢:

1. 数组  2. json数据  3. 图片 4. 脚本 5. 样式文件 

关于复杂类型的存储:

var obj = {
  name: 'zhoufangbing',
  age: '22'
}
localStorage.setItem('person', obj)

直接存储会出问题,这是需要 JSON.parse和JSON.stringify 转化一下~

var obj = {
  name: 'zhoufangbing',
  age: '22'
}
localStorage.setItem('person', JSON.stringify(obj))
var person = JSON.parse(localStorage.getItem('person'))
console.log(person)

存的时候 用JSON.stringify 把对象转化成 字符串~ 取得时候 再使用 JSON.parse 把 字符串转化成对象~

注意的问题:

1. key的唯一性,否则会被覆盖

2. 本地存储超出限额~需要进行异常处理 避免超出容量报错。超出则会报Uncaught QuotaExceededError错误(如下方)。

// 当存储数据大小超过限制时,会报以下错误:
// `obj` 指报错时存放数据的键值
Uncaught QuotaExceededError: Failed to set the 'obj' property on 'Storage': Setting the value of 'obj' exceeded the quota.

代码 容错处理:

var obj = {
  name: 'zhoufangbing',
  age: 21
}
// 采用 try catch
try {
 localStorage.setItem('person', JSON.stringify(obj))
} catch (oException) {
  if(oException.name == 'QuotaExceededError') {
    console.log('超出本地存储限额!')
  }
}

本地存储取数据 相比于 从网络拉去数据 在网差的条件下(高延迟 弱网络) 速度快些~

(四)index DB 

index DB: 一种能在浏览器中持久地存储 结构化 数据的数据库,并为web提供了丰富的查询能力。

indexDB按照域名分配独立空间,一个域名下可创建多个数据库,每个数据库可创建多个表,每个表可存储多个对象数据~

indexDB ----->  域名 ------> 数据库 --------> 表 ---------->  对象数据

IndexedDB 不属于关系型数据库(不支持 SQL 查询语句),更接近 NoSQL 数据库。

通过indexDB实现离线数据库:

1)新建数据库或者打开数据库

如果没有该名称的数据库就新建 如果有就打开

var request = window.indexedDB.open(databaseName, version)

// 例子
var request = window.indexedDB.open(‘luckybing,1)

如果不写第二个参数,版本打开是当前版本,如果是新建,则默认为1

2)回调函数

// 打开失败时
request.onerror = function (event) {
  console.log('数据库打开报错');
};

// 打开成功时
request.onsuccess = function (event) {
  console.log('数据库打开成功');
}

最后附上阮一峰大大的关于index DB文章:http://www.ruanyifeng.com/blog/2018/07/indexeddb.html

 

离线存储:

(一)什么是离线、离线存储

应用在无网或者弱网的环境下,称为离线。

离线存储即可以让应用在离线的情况下继续使用,通过 manifest 文件指明需要缓存的资源。

Web App = html5 + css3 + js 

(二)如何判断是否为离线状态

navigator.onLine

当有网络连接的时候 true  当无网络连接的时候 false

(三)html5提供的数据持久化技术

1)Application Cache 应用缓存  只能缓存应用本身不能缓存数据

2) 数据缓存:dom存储  ---->  localStorage 和 sessionStorage : 利用键值对进行存储

3) web sql : 关系型数据库存储,通过sql语句访问 ,能够存储更为复杂的数据,把数据库放在表里

4) indexDB:索引型数据库

(四)离线缓存的原理

弊端:

1. 有更新把 manifest的文件全部拉取,不是拉取只更改了的文件。

2. 第二次访问离线的数据才是最新的,因为第一次访问的是 app cache 里面的,在访问 app cache的同时,拉取 manifest ,所以第二次才是最新的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值