HTML5 本地存儲


早期Web使用cookie在瀏覽器端保存數據,但存在以下問題:

  1. cookie的大小限制在4KB
  2. 瀏覽器會限制所有站點在計算機上的存儲cookie總數
  3. cookie會隨着每次HTTP事務一起發送,會浪費一部分帶寬

HTML5提供了WebStorage本地存儲、IndexedDB本地數據庫等,能夠存儲更多更復雜的數據。

一、WebStorage

WebStorage以Key-Value對的方式存儲,容量有5M,分為兩種:

  • 永久性的本地存儲localStorage,可以永久存儲在瀏覽器端
  • 會話級別的本地存儲sessionStorage,關閉瀏覽器窗口數據會清空

瀏覽器支持:除了IE7及更早版本,其它瀏覽器均可支持

檢查瀏覽器是否支持:

if(typeof(Storage) !== “undefined”)
{
// 支持
}else
{
// 不支持
}

操作API:

以下方法均用 loaclStorage 或 sessionStorage 調用
getItem(key)	     <=>   sessionStorage.Key             獲取值
setItem(key,value)    <=>   sessionStorage.Key = value  設置值
removeItem(key)
length	  返回key/value列表的長度
key(index)    返回對應索引的key值
clear() 	  清空存儲(刪除所有key/value對)

遍歷:

var se = window.sessionStorage;
for(var i=0;i<se.length;i++)
{
   console.log("{0}:{1}\n".format(se.key(i),se.getItem(se.key(i))));
}

事件

當存儲區域(localstorage、sessionstorage)被修改時,將觸發storage事件。注意,該事件只會在同源頁面觸發,不會在發生修改的頁面觸發。

事件對象 StorageEvent 

target         事件目標(DOM 樹中的最大目標)
type           事件的類型
bubbles        事件通常是否會出現冒泡
cancelable     事件是否可取消
key  	       鍵更改的key
oldValue       正在更改鍵的舊值
newValue       正在更改鍵的新值
url 	       鍵更改的文檔的地址
storageArea    受影響的存儲對象

示例:

window.addEventListener("storage", (e) => {});

二、IndexedDB

與WebStorage使用簡單字符串鍵值對不同,IndexedDB是為了能夠在客戶端儲存大量的結構化數據,並使用索引高效檢索的API。前者適合存儲少量的數據,對於存儲大量結構化的數據,則可使用IndexedDB本地數據庫。

瀏覽器兼容性:所有主流瀏覽器都已兼容。

基本概念

數據庫:IDBDatabase 對象      每個域名(嚴格的說是協議+域名+端口)都可以新建任意多的數據庫。同一個時刻只能有一個版本的數據庫存在
對象倉庫:IDBObjectStore 對象   每個數據庫包含若干個對象倉庫,類似於關系型數據庫中的表格
數據記錄: 對象倉庫保存的是數據記錄,只有主鍵和數據體兩部分。數據體可以是任意數據類型。
索引: IDBIndex 對象   數據記錄的讀寫和刪改,都要通過事務完成。事務對象提供error、abort和complete三個事件,用來監聽操作結果。
事務: IDBTransaction 對象   
操作請求:IDBRequest 對象
指針: IDBCursor 對象
主鍵集合:IDBKeyRange 對象

打開數據庫

var request = window.indexedDB.open(databaseName, version); // 如果不存在則創建

open 請求不會立即打開數據庫或者開始一個事務, 而是返回一個IDBRequest對象,這個對象通過error、success、upgradeneeded三個事件處理打開數據庫的操作結果。

request.onerror = function (event) {
  console.log('數據庫打開報錯');
};
var db;
request.onsuccess = function (event) {
  db = request.result;
  console.log('數據庫打開成功');
};
// 如果指定的版本號,大於數據庫的實際版本號,就會發生數據庫升級事件upgradeneeded
request.onupgradeneeded = function (event) {
  db = event.target.result;
}

通過事件對象的target.result屬性,拿到數據庫實例

三、Web SQL Datebase

HTML5 IndexedDB和Web SQL Database都是本地數據庫數據存儲,Web SQL Database數據庫要出來的更早,然並卵。從2010年11月18日W3C宣布舍棄Web SQL database草案開始,就已經注定Web SQL Database數據庫是明日黃花。因此在此只做一些了解。

Web SQL Database允許引用程序通過一個異步JavaScript接口訪問SQLlite數據庫。瀏覽器兼容性:主流瀏覽器除IE、Edge、Firefox

 HTML5對Web SQL的操作包含以下3個核心方法:

  • openDatebase:用來創建或打開數據庫
  • transaction:允許我們執行事務處理
  • executeSql:用於執行SQL語句

1.創建/打開數據庫

var db = openDatabase(name,version,text,size,callback)
參數:數據庫名稱、版本號、描述文本、數據庫大小(字節)、創建回調(非必須)

2.執行事務

db.transaction(function (tx) {  
   // ... tx為transaction對象的引用。
});

3.寫SQL語句

executeSql(sql,[],datahandler,errorhandler)
參數:要執行的sql語句,sql語句中占位符"?"對應的參數值,執行成功時調用的回調,失敗時調用的回調

示例:

$(function(){
   var db = openDatabase("data.db","1.0","demo data",1024*1024);
    if(!db)
    {
        alert("該瀏覽器不支持Web SQL");
    }
    db.transaction(function (tx) {
        // 創建表
        tx.executeSql("create table if not exists Demo(uName text null,title text null ,words text null)",
        [],function (tx,result) { /*result返回的結果*/ },function (tx,message) { /*message是錯誤信息的描述*/ });
        // 寫入數據
        tx.executeSql("insert into Demo(uName,title,words)values(?,?,?)",["姓名","標題","內容"],
            function (tx,data) { alert(data) }, function (tx, error) { alert(error) });
        // 讀取數據
        tx.executeSql("select * from deom",[],function (tx, data) { alert(data) },
            function (tx, error) { alert(error) });
    });
});

四、Application Cache(應用緩存)

HTML5引入了應用程序緩存技術,意味着web應用可進行緩存,並在沒有網絡的情況下使用,通過創建cache manifest文件,可以輕松的創建離線應用。

Application Cache帶來的三個優勢是:① 離線瀏覽 ② 提升頁面載入速度 ③ 降低服務器壓力;缺點是:① 更新版本后,必須刷新一次才會啟動新版本 ② 進入離線存儲的頁面,如果不更新版本,是會將其當成靜態頁面不請求 ③ 無法進行灰度發布等策略。

Application Cache和WebStorage在使用上的區別是,后者存儲非關鍵性數據,做錦上添花的事情,前者用於存儲靜態資源。

使用方法:

 1.配置manifest文件

<html manifest="demo.appcache"> ... </html>

 2.manifest文件

  manifest 文件是簡單的文本文件,它告知瀏覽器被緩存的內容(以及不緩存的內容)。

  manifest 文件可分為三個部分:

  ① CACHE MANIFEST - 列出需要緩存的文件(必需)

  ② NETWORK - 列出不需要被緩存的文件(非必需)

  ③ FALLBACK - 列出規定當頁面無法訪問時的回退頁面(文件,比如 404 頁面,非必需)

CACHE MANIFEST    # 緩存文件愛你
/theme.css
/main.js
 
NETWORK:  # 不需要緩存的文件
login.jsp
 
FALLBACK:
/html/ /offline.html

 3.服務器端

  manifest文件需要配置正確的MIME-type,即 "text/cache-manifest",必須在web服務器上進行配置。

 4.常用API

  核心是applicationCache對象,有個status屬性,表示應用緩存的當前狀態:

0 (UNCACHED):  無緩存, 即沒有與頁面相關的應用緩存
1 (IDLE): 閑置,即應用緩存未得到更新
2 (CHECKING): 檢查中,即正在下載描述文件並檢查更新
3 (DOWNLOADING): 下載中,即應用緩存正在下載描述文件中指定的資源
4 (UPDATEREADY): 更新完成,所有資源都已下載完畢
5 (IDLE):  廢棄,即應用緩存的描述文件已經不存在了,因此頁面無法再訪問應用緩存

 5.JS事件(表示應用緩存的狀態的改變)

checking : 在瀏覽器為應用緩存查找更新時觸發
error : 在檢查更新或下載資源期間發送錯誤時觸發
noupdate : 在檢查描述文件發現文件無變化時觸發
downloading : 在開始下載應用緩存資源時觸發
progress:在文件下載應用緩存的過程中持續不斷地下載地觸發
updateready : 在頁面新的應用緩存下載完畢觸發
cached : 在應用緩存完整可用時觸發

 6.更新緩存

  1.更新manifest文件  2.清除瀏覽器緩存  3.通過JavaScript操作

applicationCache.addEventListener('updateready', function(e) {
    if (applicationCache.status == applicationCache.UPDATEREADY) {
        applicationCache.swapCache(); //使用新版本資源
        window.location.reload(); //刷新頁面
    }
}, false);

 6.注意事項

  1. 瀏覽器對緩存數據的容量限制可能不太一樣(某些瀏覽器設置的限制是每個站點 5MB)
  2. 如果manifest文件,或者內部列舉的某一個文件不能正常下載,整個更新過程將視為失敗,瀏覽器繼續全部使用老的緩存
  3. 引用manifest的html必須與manifest文件同源,在同一個域下
  4. 瀏覽器會自動緩存引用manifest文件的HTML文件,這就導致如果改了HTML內容,也需要更新版本才能做到更新。
  5. manifest文件中CACHE則與NETWORK,FALLBACK的位置順序沒有關系,如果是隱式聲明需要在最前面
  6. FALLBACK中的資源必須和manifest文件同源
  7. 更新完版本后,必須刷新一次才會啟動新版本(會出現重刷一次頁面的情況),需要添加監聽版本事件。
  8. 站點中的其他頁面即使沒有設置manifest屬性,請求的資源如果在緩存中也從緩存中訪問
  9. 當manifest文件發生改變時,資源請求本身也會觸發更新

 7.離線緩存與傳統瀏覽器緩存的區別

  1. 離線緩存是針對整個應用,瀏覽器緩存是單個文件

  2. 離線緩存斷網了還是可以打開頁面,瀏覽器緩存不行

  3. 離線緩存可以主動通知瀏覽器更新資源

 

參考資料:

http://www.ruanyifeng.com/blog/2018/07/indexeddb.html

https://www.cnblogs.com/LuckyWinty/p/5699117.html

https://www.cnblogs.com/yexiaochai/p/4271834.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM