HTML5本地存储机制是怎样的?

html-css08

HTML5本地存储机制是怎样的?,第1张

HTML5 是下一代 HTML 标准,开始吸引越来越多人的目光。HTML5 的 DOM Storage 机制提供了一种方式让程序员能够把信息存储到本地的计算机上,在需要时获取。这点和 cookie 相似,区别是 DOM Storage 提供了更大容量的存储空间。

目前,在客户端保存数据使用最多的是 cookie,但 cookie 的大小上限为 4KB,并且每次请求一个新页面时 cookie 都会被发送过去。更多的存储空间需要浏览器本身或是插件的支持,例如只在 Internet Explorer 上使用的 userData,需要额外安装插件的 Google Gears 和 Flash。现在,HTML5 提供了一种标准的接口,使程序员可以简单地访问存储的数据。由于键值对存储在本地计算机上,在页面加载完毕后可以通过 JavaScript 来操作这些数据。

HTML5 的建议是每个网站提供给 Storage 的空间是 5MB,一般来说足够存字符串。如果存入的数据太大,有些浏览器如 Chrome 会抛出 QUOTA_EXCEEDED_ERR 异常。所以虽然 DOM Storage 提供的空间比 cookie 要大很多,但在使用需要注意限制。

安全性

一般不要在客户端存储敏感的信息,使用 localStorage、globalStorage 等在客户端存储的信息都非常容易暴露。应该在完成数据存储后使用 clear 或者 removeItem 方法清除保存在 Storage 对象中的数据。

存储事件驱动

如果想在存储成功或修改存储的值时执行一些操作,可以用 DOM Storage 接口提供的事件。

html5 本地存储有五种方案。

1、LocalStorage

LocalStorage就是Key-Value的简单键值对存储结构,Web Storage除了localStorage的持久性存储外,还有针对本次回话的sessionStorage方式,一般情况下localStorage较为常用,示例代码如下:

function save(dataModel){

var value = dataModel.serialize()

window.localStorage['DataModel'] = value

window.localStorage['DataCount'] = dataModel.size()

console.log(dataModel.size() + ' datas are saved')

return value

}

function restore(dataModel){

var value = window.localStorage['DataModel']

if(value){

dataModel.deserialize(value)

console.log(window.localStorage['DataCount'] + ' datas are restored')

return value

}

return ''

}

function clear(){

if(window.localStorage['DataModel']){

console.log(window.localStorage['DataCount'] + ' datas are cleared')

delete window.localStorage['DataModel']

delete window.localStorage['DataCount']

}

}

2、Cookie

这种存储方式存储内容很有限,只适合做简单信息存储,存取接口设计得极其反人类,举例如下:

function getCookieValue(name) {

if (document.cookie.length >0) {

var start = document.cookie.indexOf(name + "=")

if (start !== -1) {

start = start + name.length + 1

var end = document.cookie.indexOf("", start)

if (end === -1){

end = document.cookie.length

}

return unescape(document.cookie.substring(start, end))

}

}

return ''

}

function save(dataModel) {

var value = dataModel.serialize()

document.cookie = 'DataModel=' + escape(value)

document.cookie = 'DataCount=' + dataModel.size()

console.log(dataModel.size() + ' datas are saved')

return value

}

3、Indexed Database API

IndexedDB可以存储结构对象,可构建key和index的索引方式查找,目前各浏览器的已经逐渐支持IndexedDB的存储方式,其使用代码如下,需注意IndexedDB的很多操作接口类似NodeJS的异步回调方式,特别是查询时连cursor的continue都是异步再次回调onsuccess函数的操作方式,因此和NodeJS一样使用上不如同步的代码容易。

function save(dataModel){

var tx = db.transaction("meters", "readwrite")

var store = tx.objectStore("meters")

dataModel.each(function(data){

store.put({

id: data.getId(),

tag: data.getTag(),

name: data.getName(),

meterValue: data.a('meter.value'),

meterAngle: data.a('meter.angle'),

p3: data.p3(),

r3: data.r3(),

s3: data.s3()

})

})

tx.oncomplete = function() {

console.log(dataModel.size() + ' datas are saved')

}

return dataModel.serialize()

}

4、FileSystem API

FileSystem API相当于操作本地文件的存储方式,目前支持浏览器不多,其接口标准也在发展制定变化中,因此也可以动态生成图片到本地文件,然后通过 filesystem:http:*** 的URL方式直接赋值给img的html元素的src访问。

function save(dataModel) {

var value = dataModel.serialize()

fs.root.getFile('meters.txt', {create: true}, function (fileEntry) {

console.log(fileEntry.toURL())

fileEntry.createWriter(function (fileWriter) {

fileWriter.onwriteend = function () {

console.log(dataModel.size() + ' datas are saved')

}

var blob = new Blob([value], {type: 'text/plain'})

fileWriter.write(blob)

})

})

return value

}

5、Application Cache

window.applicationCache 对象是对浏览器的应用缓存的编程访问方式。其 status 属性可用于查看缓存的当前状态:

var appCache = window.applicationCache

switch (appCache.status) {

case appCache.UNCACHED: // UNCACHED == 0

return 'UNCACHED'

break

case appCache.IDLE: // IDLE == 1

return 'IDLE'

break

case appCache.CHECKING: // CHECKING == 2

return 'CHECKING'

break

case appCache.DOWNLOADING: // DOWNLOADING == 3

return 'DOWNLOADING'

break

case appCache.UPDATEREADY: // UPDATEREADY == 4

return 'UPDATEREADY'

break

case appCache.OBSOLETE: // OBSOLETE == 5

return 'OBSOLETE'

break

default:

return 'UKNOWN CACHE STATUS'

break

}

HTML5本地存储——Web SQL Database

在HTML5 WebStorage介绍了html5本地存储的Local Storage和Session Storage,这两个是以键值对存储的解决方案,存储少量数据结构很有用,但是对于大量结构化数据就无能为力了,灵活大不够强大。

Web SQL Database

我们经常在数据库中处理大量结构化数据,html5引入Web SQL Database概念,它使用 SQL 来操纵客户端数据库的 API,这些 API 是异步的,规范中使用的方言是SQLlite,你假如感兴趣,可以来我的裙,一起学习交流下,同时也欢迎每一位大神,前面是二五七,中间是014,后面是001,组合起来就是了,非常欢迎真心久留学习的。

三个核心方法

但是我们学一下也没什么坏处,而且能和现在W3C力推的IndexedDB做比较,看看为什么要废弃这种方案。Web SQL Database 规范中定义的三个核心方法:

openDatabase:这个方法使用现有数据库或新建数据库来创建数据库对象

transaction:这个方法允许我们根据情况控制事务提交或回滚

executeSql:这个方法用于执行SQL 查询