因爲以前在參加面試或者筆試的過程當中常常會被問到HTML5存儲的內容,包括它們之間的區別、特徵和應用範圍,因此看到一篇介紹不錯的文章,把裏面的我的以爲適合個人內容按照本身的理解總結以下。方便之後忘記了進行備查。css
原文連接:HTML5 5大存儲方式總結html
在HTML5
出現以前,Cookies
便佔據了客戶端存儲的整個江山,就像是蠻荒時代的野蠻生長,cookies
很好、快速地知足實際應用的需求。可是它的問題也很明顯,cookies
會在請求頭上帶着數據,並且大小限制在4K之內,這是很是不安全的,容易被外部截取,還存在domain
污染。html5
IE
瀏覽器特別喜歡搞本身的一套,對於增長存儲容量加入了UserData
,大小是64K
,可是其餘瀏覽器不喜歡跟它玩,也就只有它本身一家支持。面試
那麼,重點來了。既然cookies
問題那麼多,就要想辦法解決,否則無法繼續往前發展。首先要確認它的問題有哪些,而後根據這些問題尋找解決方案。數據庫
4K
存儲容量問題存儲方式瀏覽器
以鍵值對(key-value)的方式存儲,永久存儲,永不失效,除非手動刪除。緩存
存儲容量安全
每一個域名5M
。服務器
經常使用的APIcookie
getItem
//取記錄
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")'); });
讀取數據
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
大部分操做並非咱們經常使用的調用方法(返回結果的模式),而是(請求-響應模式),好比打開數據庫的操做