1. 程式人生 > >離線應用和客戶端儲存(JavaScript)

離線應用和客戶端儲存(JavaScript)

1.進行離線檢測:

支援離線web應用開發是HTML5的一個重點。所謂離線,就是裝置再不能上網的情況下仍然可以執行應用。HTML5把離線應用作為重點。

開發離線web應用需要幾個步驟:首先確保應用知道裝置是否能上網,以便下一步執行正確的操作。然後,應用還必須能訪問一定的資源(影象,JavaScript,css等),只有這樣才能正常工作。最後,必須有一塊本地空間用於儲存資料。無論是否上網都不妨礙讀寫。

開發離線的第一步就是知道裝置是線上還是離線,HTML5定義一個屬性:navigator.onLine的屬性。這個屬性值為true,表示裝置線上,值為false,表示裝置離線。為了更好的確定網路是否可用,HTML5還定義了兩個事件。這兩個事件是在window物件上觸發:online和offline。程式碼如下:


2.應用快取:

HTML5的應用快取:appcache,專門為開發離線web應用而設計的。appcache就是從瀏覽器的快取中分出來的一塊快取區。要想在這個快取區中儲存資料,可以使用一個描述檔案(manifest file),列出要下載和快取的資源。其實這個主要的API是applicationCache物件。

這個物件有一個status屬性,屬性的值是常量,表示應用快取的如下狀態:

0:無快取,即沒有與頁面相關的應用快取。

1:閒置,即應用快取未得到更新

2:檢查中,即應用快取正在下載描述檔案中指定的資源

3:下載中,即應用快取正在下載描述檔案中指定的資源

4:更新完成,即應用快取已經更新資源,而且所有的資源都已經全部下載完畢。可以通過swapCache()來使用。

5:廢棄:即應用快取的描述檔案已經不存在了。因此頁面無法再訪問應用快取。

應用快取還有很多相關的事件,表示其狀態的改變,以下就是這些事件:

checking:在瀏覽器為應用快取查詢更新時觸發。

error:在檢查更新或者下載資源的期間發生錯誤時觸發

onupdate:在檢查描述檔案發現檔案無變化時觸發。

downloading:再開始下載應用快取資源時觸發

progress:在檔案下載應用快取過程中持續不斷的觸發。

updateready:在頁面新的應用快取下載完畢並且可以通過swapCache()使用時觸發。

cached:在應用快取完整可用時觸發。

一般來講:這些事件會隨著頁面載入按上述順序依次觸發,不過,通過呼叫update方法也可以手工干預,讓應用快取為檢查更新而觸發上述事件。

applicationCache.update()

update()一經呼叫,應用快取就會去檢查描述檔案是否更新(觸發checking事件),然後像頁面剛剛載入一樣,繼續執行後續操作,如果觸發了cached事件,說明應用快取已經準備就緒,不會再發生其它操作了。如果觸發了updateready事件,則說明新版本應用快取已經可用。而此時你需要呼叫swapCache()來啟用新的快取。

EventUtil.addHandler(applicationCache,"updateready",function(params) { applicationCache.swapCache();});

3.資料儲存:

提供資料儲存的有以下方式:cookie,web storage,indexedDB等

cookie相關的知識,網上有很多資源,我就不再詳細的介紹。

web storage:包含了兩種物件的定義:sessionStorage和globalStorage(後來被localStorage)。

①.sessionStorage:

sessionStorage物件儲存特定的某個會話資料,也就是該資料只能保持到瀏覽器關閉。這個物件就像會話cookie,也會在瀏覽器關閉後消失。由於sessionStorage物件其實是storage的一個例項,所以可以使用setitem()或者直接設定新的屬性來儲存資料:以下就是兩種方法:

// 使用方法儲存資料sessionStorage.setItem("name","zhanghuiqi");// 使用屬性儲存資料sessionStorage.book = "javascript";

sessionStorage中有資料,可以使用getItem()或者通過直接訪問屬性名來或許資料:


還可以通過結合length和key方法來迭代sessionStorage中的值:


要從sessionStorage刪除資料可以使用:

// 使用delete刪除一個值delete sessionStorage.name;// 使用方法刪除一個值:sessionStorage.removeItem("book");

sessionStorage只適用於針對會話的小段資料,如果需要跨越會話儲存資料,那麼globalStorage或者localStorage更為合適。

②.localStorage物件:

作為持久儲存客戶端資料的方案。儲存在localStorage中的資料保留到通過JavaScript刪除或者是使用者清除瀏覽器快取。


③storage事件:

對storage物件進行任何修改,都會在文件上觸發storage事件,當通過屬性或者setItem()方法儲存資料,或者使用delete操作符或者removeItem()刪除資料,或者使用clean()方法時,都會觸發該事件,這個事件的event物件有以下屬性:

domain:發生變化的儲存空間的域名

key:設定或者刪除的鍵名

newvalue:如果設定值,則是新值,如果是刪除鍵,則是null

oldvalue:鍵被更改之前的值

無論對sessionStorage,localStorage進行操作都會觸發storage事件,程式碼如下:

window.addEventListener("storage",function (event) { alert('Storage changed for'+event.domain); });

上述程式碼很容易犯的錯誤是,在同一個網頁修改本地儲存,又在同一個網頁監聽,這樣是沒有效果的。

需要將上面兩個網頁儲存,放到同一個伺服器上,然後,先開啟A.html,再開啟B.html。就會看到A.html會彈出提示框。注意兩個網頁要同源。

對這個事件解釋不錯的一個帖子:點選開啟連結

4.indexedDB的介紹和使用:

是在瀏覽器中儲存結構化資料的一種資料庫。indexedDB是為了替代目前已被廢棄的Web SQL Database API而出現的。indexedDB的思想是想建立一套API,方便儲存和讀取JavaScript物件,同事還支援查詢和搜尋。

indexedDB的設計操作完全是非同步操作的。因此,大多數操作都是以請求的方式進行。但這些操作會後期執行。然後如果成功,則返回結果。如果失敗,則返回錯誤,差不多每一次的indexedDB操作,都需要你註冊onerror或者onsuccess事件處理程式,以確保適當地處理結果。

indexedDB最大的特點就是使用物件儲存資料。而不是使用表儲存資料。

使用indexedDB第一步就是開啟它,即要把開啟的資料庫名傳遞給indexDB.open().呼叫indexDB.open返回的是一個IDBRequest物件。這個物件上新增上述的兩個事件:程式碼如下


預設情況下,indexedDB資料庫是沒有版本號的。最好一開始就為資料庫指定一個名字,為此可以呼叫setVersion()方法,傳入字串形式表示版本號。

關於indexedDB的更多知識,會有後續專門的文章進行闡述,這裡只是簡單的提一下

indexedDB建立物件儲存空間,需要定義一個鍵,然後就可以新增資料,可以使用遊標在物件儲存空間中查詢特定的物件,而索引則是為了提高查詢速度而基於特定的屬性建立的。

有了上述這些選擇,就可以在客戶端機器上使用JavaScript儲存大量資料了,但是你要小心,不要在客戶端儲存敏感資料,因為資料快取不會加密。

寫這麼多關於離線快取的知識點,希望對大家有所幫助,與前端的小夥伴共勉......