因为以前在参加面试或者笔试的过程当中常常会被问到HTML5存储的内容,包括它们之间的区别、特征和应用范围,因此看到一篇介绍不错的文章,把里面的我的以为适合个人内容按照本身的理解总结以下。方便之后忘记了进行备查。原文连接:HTML5 5大存储方式总结css
在HTML5
出现以前,Cookies
便占据了客户端存储的整个江山,就像是蛮荒时代的野蛮生长,cookies
很好、快速地知足实际应用的需求。可是它的问题也很明显,cookies
会在请求头上带着数据,并且大小限制在4K之内,这是很是不安全的,容易被外部截取,还存在domain
污染。html
IE
浏览器特别喜欢搞本身的一套,对于增长存储容量加入了UserData
,大小是64K
,可是其余浏览器不喜欢跟它玩,也就只有它本身一家支持。html5
那么,重点来了。既然cookies
问题那么多,就要想办法解决,否则无法继续往前发展。首先要确认它的问题有哪些,而后根据这些问题寻找解决方案。面试
4K
存储容量问题存储方式数据库
以键值对(key-value)的方式存储,永久存储,永不失效,除非手动删除。浏览器
存储容量缓存
每一个域名5M
。安全
经常使用的API服务器
getItem
//取记录markdown
setItem
//设置记录
removeItem
//移除记录
key
//取key
所对应的值
clear
//清除记录
HTML5
的本地存储API
中的localstorage
与sessionstorage
在使用方法上是相同的,区别在于sessionstorage
在关闭页面后即被清空,而localstorage
则会一直保存,除非手动删除。
本地缓存应用所需的文件
使用方法
一、配置manifest
文件
页面上:
<!DOCTYPE HTML> <html manifest="demo.appcache"> ... </html>
manifest
文件:
manifest
是最简单的文本文件,它告知浏览器被缓存的内容(以及不缓存的内容)。
manifest
文件分为三个部分:
CACHE MANIFEST
-在此标题下列出的文件将在首次下载后进行缓存NETWOrK
-在此标题下的文件须要与服务器进行链接,且不会被缓存FALLBACK
-在此标题下的文件规定当页面没法被访问时的回退页面(好比404
页面)完整demo
CACHE MANIFEST # 2016-07-24 v1.0.0 /theme.css /main.js NETWORK: login.jsp FALLBACK: /html/ /offline.html
服务器上:manifest
文件须要配置正确的MIME-type
,即text/cache-manifest
。
经常使用API
核心是applicationCache
对象,有个status
属性,表示应用缓存的当前状态:
0 (UNCACHED)
:无缓存,没有和页面相关的应用缓存
1 (IDLE)
:闲置,应用缓存没有获得更新
2 (CHECKING)
:检查中,正在下载描述文件并检查更新
3 (DOWNLOADING)
:下载中,应用缓存正在下载与描述文件中指定的资源
4 (UPDATEREADY)
:更新完成,全部资源都已经下载完毕
5 (IDLE)
:废弃,应用缓存的描述文件已经不存在了,所以页面没法再访问应用缓存
相关事件
表示应用缓存状态的改变:
checking
:在浏览器为应用缓存查找更新时触发
error
:在检查更新或下载资源期间发生错误时触发
noupdate
:在检查描述文件发现文件无变化时触发
downloading
:在开始下载应用缓存资源时触发
progress
:在文件下载应用缓存的过程当中持续不断地下载时触发
updateready
:在页面新的应用缓存下载完毕时触发
cached
:在应用缓存完整可用时触发
application cache
的三个优点:
注意事项:
5M
)manifest
文件,或者内部列举的某一个文件不能正常下载,整个更新过程将视为失败,浏览器继续所有使用旧的缓存manifest
的html
必须与manifest
文件同源,在同一个域下manifest
文件的html
文件,这就致使了若是更改了html
内容,也须要更新版本才能作到最新manifest
文件中的CACHE
与NETWOrK
、FALLBACK
的位置顺序没有关系,若是是隐式声明须要在最前面FALLBACK
中的资源必须和manifest
文件同源manifest
属性,请求的资源若是在缓存中也从缓存中访问manifest
文件发生改变时,资源请求自己也会触发更新离线缓存和传统浏览器缓存的区别
Web SQL
数据库API
并非HTML5
规范的一部分,但它是一个独立的规范,引入了一组使用SQL
操做客户端数据库的APIs
。
核心方法
openDatabase
:使用现有的数据库或新建的数据库建立一个数据库对象transaction
: 控制一个事务,以及基于这种状况执行提交或回滚executeSql
:用于执行实际的SQL
查询打开数据库
var db = openDatabase('mydb', '1.0', 'TEST DB', 2 * 1024 * 1024, fn);
执行查询操做
var db = openDatabase('mydb', '1.0', 'TEST DB', 2 * 1024 * 1024); db.transaction(function (tx) { tx.executeSql('CREATE TABLE IF NOT EXISTS WIN (id unique, name)'); })
插入数据
注:博客主题里的代码块样式
var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024); db.transaction(function (tx) { tx.executeSql('CREATE TABLE IF NOT EXISTS WIN (id unique, name)'); tx.executeSql('INSERT INTO WIN (id, name) VALUES (1, "winty")'); tx.executeSql('INSERT INTO WIN (id, name) VALUES (2, "LuckyWinty")'); });
注:须要实现的代码块样式,这个是 markdowpad2 里的操做,也是不少markdown写做工具提供的操做,只须要按一下 tab 键,很是方便
var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024); db.transaction(function (tx) { tx.executeSql('CREATE TABLE IF NOT EXISTS WIN (id unique, name)'); tx.executeSql('INSERT INTO WIN (id, name) VALUES (1, "winty")'); tx.executeSql('INSERT INTO WIN (id, name) VALUES (2, "LuckyWinty")'); });
读取数据
db.transaction(function (tx) { tx.executeSql('SELECT * FROM WIN', [], function (tx, results) { var len = results.rows.length, i; msg = "<p>查询记录条数: " + len + "</p>"; document.querySelector('#status').innerHTML += msg; for (i = 0; i < len; i++){ alert(results.rows.item(i).name ); } }, null); });
索引数据库(IndexedDB
)API
(做为HTML5
的一部分)对建立具备丰富本地存储数据的数据密集型的离线HTML5 Web
应用程序颇有用,同时它还有助于本地缓存数据,使传统在线Web
应用程序(好比移动Web
应用程序)可以快速的运行和响应。
异步API
在IndexedDB
大部分操做并非咱们经常使用的调用方法(返回结果的模式),而是(请求-响应模式),好比打开数据库的操做