1.支持離線Web應用是HTML5開發的另一個重點。所謂離線Web應用,就是在設備不能上網的情況下仍然可以運行的應用。
2.開發離線Web應用需要幾個步驟,首先是確保應用知道設備是否能上網,以便下一步執行正確的操作。然后,應用還必須能訪問一定的資源(圖像、JavaScript、CSS等),只有這樣才能正常工作。最后,必須有一塊本地空間能用于保存數據,無論是否能上網都不妨礙讀寫。
## 離線檢測
* * * * *
3.HTML5定義了一個navigator.onLine屬性,用于獲取設備是在線還是離線。此外HTML5還定義了online和offline事件,當網絡在離線和在線狀態切換時觸發。
## 應用緩存
* * * * *
4.HTML5的應用緩存(application cache或簡稱為appcache)是專門為開發離線web應用而設計的。appcache就是從瀏覽器的緩存中分出來的一塊緩存區。要想在這個緩存中保存數據,可以使用一個描述文件(manifest file),列出要下載和緩存的資源,然后在<html>標簽中的mani屬性中指定這個文件路徑,就可以將描述文件和頁面關聯起來。
## 數據存儲
* * * * *
5.隨著Web應用的出現,也產生了對于能夠直接在客戶端上存儲用戶信息(包括登錄信息、偏好設定等等)能力的要求。
#### cookie
* * * * *
6.HTTP Cookie,通常直接叫做cookie,最初是用在客戶端用于存儲會話信息的。該標準要求服務器對任意HTTP請求發送Set-Cookie HTTP頭作為響應的一部分,其中包含會話信息,瀏覽器會存儲這樣的會話信息,并在這之后,通過為每個請求添加Cookie HTTP頭將信息發送回服務器。
7.**cookie在性質上是綁定在特定的域名下的。當設定了一個cookie后,再給創建它的域名發送請求時,都會包含這個cookie。這個限制確保了儲存在cookie中的信息只能讓批準的接受者(服務器)訪問,而無法被其他域訪問。**
8.瀏覽器還對單個域名下,cookie的數量(通常是50或無限制)和cookie的尺寸(4096B加減1,這個尺寸是單個域名下所有cookie加起來占據的空間不得大于此)作出了限制。違反前者瀏覽器會清除以前設置的單個cookie,違反后者則該域名下的所有cookie會被瀏覽器直接丟棄。
9.cookie由瀏覽器保存的以下幾塊信息構成:
(1)名稱-值:必須被URL編碼。實際發送回服務器的只有這個名值對。
(2)域:cookie對哪個域是有效的。所有向該域發送的請求中都會包含這個cookie信息。這個值可以包含子域,也可以不包含它(如.wrox.com則對wrox.com的所有子域都有效)。如果沒有顯式設定這個值,那么這個值會被認作來自設置cookie的那個域。
(3)路徑:對于指定域中的那個路徑,應該向服務器發送cookie。例如可以指定cookie只有從http://www.wrox.com/books/ 中才能訪問,那么http://www.wrox.com 的頁面就不會被發送cookie信息。
(4)失效時間:表示cookie何時應該被刪除的時間戳。默認情況下,瀏覽器會話結束(關閉當前頁面標簽)時即將所有cookie刪除;不過也可以自己以GMT格式的日期設置刪除時間。
(5)安全標識:指定后,cookie只有在使用SSL連接的時候才會發送到服務器。
10.cookie實例:
~~~
HTTP/1.1 200 OK
Content-type: text/html
Set-Cookie: name=value; expires=Mon, 22-Jan-07 07:10:24 GMT; domain=.wrox.com; path=/; secure
~~~
11.JavaScript中的cookie操作通過BOM的document.cookie接口。當用來獲取屬性值時,document.cookie返回當前頁面可用的所有cookie字符串,一系列由分號隔開的名值對兒:
`name1=value; name2=value; name3=value`
當用于設置值時,document.cookie屬性可以設置為一個新的cookie字符串。這個cookie字符串會被解釋并添加到現有的cookie集合中,除非設置的cookie的名稱已經存在,否則不會覆蓋cookie。設置cookie的格式如下,和Set-Cookie頭中使用的格式一樣(名值對要先編碼):
`document.cookie = 'name=ken; domain=.wrox.com'`
12.子cookie技術是指通過在單個cookie中存儲多個名值對來繞開瀏覽器對單個域名下的cookie數限制。
`name=name1=value1&name2=value2&name3=value3`
13.由于所有的cookie都會由瀏覽器作為請求頭發送,所以在cookie中存儲大量信息影響特定域的請求性能。因此最好還是盡可能減少cookie中存儲的信息,以避免影響性能。此外,不要在cookie中存儲重要和敏感的數據,因為cookie并非存儲在一個安全環境中,其中包含的任何數據都可以被其他人訪問。
#### Web存儲機制
* * * * *
14.Web Storage的目的是克服由cookie帶來的一些限制,當數據需要被嚴格控制在客戶端上,無需持續地將數據發回服務器。
15.Storage類型提供最大的存儲空間(因瀏覽器而異)來存儲名值對,只能存儲字符串。Storage的實例方法如下:
(1)clear():刪除所有值
(2)getItem(name):根據指定的名稱name獲取對應的值
(3)removeItem(name):刪除由name指定的名值對
(4)setItem(name):為指定的name設置一個對應的值
(5)key(index):獲得index處的值
16.cookie、sessionStorage、LocalStorage的區別見https://segmentfault.com/a/1190000002723469
17.indexedDB在iOS和早期android中支持不善,不作深入學習。