web workers(應用緩衝)

HTML5 是目前正在討論的新一代 HTML 標準,它代表了現在 Web 領域的最新發展方向。在 HTML5 
標準中,加入了新的多樣的內容描述標籤,直接支持表單驗證、視頻音頻標籤、網頁元素的拖拽、離線存儲和工作線程等功能。其中一個新特性就是對離線應用開發的支持。


在開發支持離線的 Web 應用程序時,開發者通常需要使用以下三個方面的功能:



  1. 離線資源緩存:需要一種方式來指明應用程序離線工作時所需的資源文件。這樣,瀏覽器才能在在線狀態時,把這些文件緩存到本地。此後,當用戶離線訪問應用程序時,這些資源文件會自動加載,從而讓用戶正常使用。HTML5 
    中,通過 cache manifest 文件指明需要緩存的資源,並支持自動和手動兩種緩存更新方式。
  2. 在線狀態檢測:開發者需要知道瀏覽器是否在線,這樣才能夠針對在線或離線的狀態,做出對應的處理。在 HTML5 
    中,提供了兩種檢測當前網絡是否在線的方式。
  3. 本地數據存儲:離線時,需要能夠把數據存儲到本地,以便在線時同步到服務器上。爲了滿足不同的存儲需求,HTML5 提供了 DOM Storage 和 Web 
    SQL Database 兩種存儲機制。前者提供了易用的 key/value 對存儲方式,而後者提供了基本的關係數據庫存儲功能。

儘管 HTML5 還處於草稿狀態,但是各大主流瀏覽器都已經實現了其中的很多功能。Chrome、Firefox、Safari 和 Opera 的最新版本都對 
HTML5 離線功能提供了完整的支持。IE8 也支持了其中的在線狀態檢測和 DOM Storage 功能。下面將具體介紹 HTML5 
離線功能中的離線資源緩存、在線狀態檢測、DOM Storage 和 Web SQL Database,最後通過一個簡單的 Web 程序說明使用 HTML5 
開發離線應用的方法。







離線資源緩存


爲了能夠讓用戶在離線狀態下繼續訪問 Web 應用,開發者需要提供一個 cache manifest 
文件。這個文件中列出了所有需要在離線狀態下使用的資源,瀏覽器會把這些資源緩存到本地。本節先通過一個例子展示 cache manifest 
文件的用途,然後詳細描述其書寫方法,最後說明緩存的更新方式。


cache manifest 示例


我們通過 W3C 提供的示例來說明。Clock Web 
應用由三個文件“clock.html”、“clock.css”和“clock.js”組成。


清單 1. 
Clock 應用代碼





				 
 <!-- clock.html --> 
 <!DOCTYPE HTML> 
 <html> 
 <head> 
  <title>Clock</title> 
  <script src="clock.js"></script> 
  <link rel="stylesheet" href="clock.css"> 
 </head> 
 <body> 
  <p>The time is: <output id="clock"></output></p> 
 </body> 
 </html> 

 /* clock.css */ 
 output { font: 2em sans-serif; } 

 /* clock.js */ 
 setTimeout(function () { 
    document.getElementById('clock').value = new Date(); 
 }, 1000); 


當用戶在離線狀態下訪問“clock.html”時,頁面將無法展現。爲了支持離線訪問,開發者必須添加 cache manifest 
文件,指明需要緩存的資源。這個例子中的 cache manifest 文件爲“clock.manifest”,它聲明瞭 3 
個需要緩存的資源文件“clock.html”、“clock.css”和“clock.js”。


清單 2. 
clock.manifest 代碼





				 
 CACHE MANIFEST 
 clock.html 
 clock.css 
 clock.js 


添加了 cache manifest 文件後,還需要修改“clock.html”,把 <html> 標籤的 manifest 
屬性設置爲“clock.manifest”。修改後的“clock.html”代碼如下。


清單 3. 設置 
manifest 後的 clock.html 代碼





				 
 <!-- clock.html --> 
 <!DOCTYPE HTML> 
 <html manifest="clock.manifest"> 
 <head> 
  <title>Clock</title> 
  <script src="clock.js"></script> 
  <link rel="stylesheet" href="clock.css"> 
 </head> 
 <body> 
  <p>The time is: <output id="clock"></output></p> 
 </body> 
 </html> 


修改後,當用戶在線訪問“clock.html”時,瀏覽器會緩存“clock.html”、“clock.css”和“clock.js”文件;而當用戶離線訪問時,這個 
Web 應用也可以正常使用了。


cache manifest 格式


下面說明書寫 cache manifest 文件需要遵循的格式。



  1. 首行必須是 CACHE MANIFEST。
  2. 其後,每一行列出一個需要緩存的資源文件名。
  3. 可根據需要列出在線訪問的白名單。白名單中的所有資源不會被緩存,在使用時將直接在線訪問。聲明白名單使用 NETWORK:標識符。
  4. 如果在白名單後還要補充需要緩存的資源,可以使用 CACHE:標識符。
  5. 如果要聲明某 URI 不能訪問時的替補 URI,可以使用 FALLBACK:標識符。其後的每一行包含兩個 URI,當第一個 URI 
    不可訪問時,瀏覽器將嘗試使用第二個 URI。
  6. 註釋要另起一行,以 # 號開頭。

清單 4 的代碼中給出了 cache manifest 中各類標識符的使用示例。


清單 4. 
cache manifest 示例代碼





				 
 CACHE MANIFEST 
 # 上一行是必須書寫的。

 images/sound-icon.png 
 images/background.png 

 NETWORK: 
 comm.cgi 


# 下面是另一些需要緩存的資源,在這個示例中只有一個 css 文件。





 CACHE: 
 style/default.css 

 FALLBACK: 
 /files/projects /projects 


更新緩存


應用程序可以等待瀏覽器自動更新緩存,也可以使用 Javascript 接口手動觸發更新。



  1. 自動更新 

    瀏覽器除了在第一次訪問 Web 應用時緩存資源外,只會在 cache manifest 文件本身發生變化時更新緩存。而 cache manifest 
    中的資源文件發生變化並不會觸發更新。


  2. 手動更新 

    開發者也可以使用 window.applicationCache 的接口更新緩存。方法是檢測 window.applicationCache.status 
    的值,如果是 UPDATEREADY,那麼可以調用 window.applicationCache.update() 
    更新緩存。示範代碼如下。



    清單 5 手動更新緩存




    				 
     if (window.applicationCache.status == window.applicationCache.UPDATEREADY) 
    {
     window.applicationCache.update(); 
    }
    

     






在線狀態檢測


如果 Web 應用程序僅僅是一些靜態頁面的組合,那麼通過 cache manifest 
緩存資源文件以後,就可以支持離線訪問了。但是隨着互聯網的發展,特別是 Web2.0 概念流行以來,用戶的提交的數據漸漸成爲互聯網的主流。那麼在開發支持離線的 
Web 
應用時,就不能僅僅滿足於靜態頁面的展現,還必需考慮如何讓用戶在離線狀態下也可以操作數據。離線狀態時,把數據存儲在本地;在線以後,再把數據同步到服務器上。爲了做到這一點,開發者首先必須知道瀏覽器是否在線。HTML5 
提供了兩種檢測是否在線的方式:navigator.online 和 online/offline 事件。



  1. navigator.onLine 

    navigator.onLine 屬性表示當前是否在線。如果爲 true, 表示在線;如果爲 false, 
    表示離線。當網絡狀態發生變化時,navigator.onLine 的值也隨之變化。開發者可以通過讀取它的值獲取網絡狀態。


  2. online/offline 事件 

    當開發離線應用時,通過 navigator.onLine 獲取網絡狀態通常是不夠的。開發者還需要在網絡狀態發生變化時立刻得到通知,因此 HTML5 
    還提供了 online/offline 事件。當在線 / 離線狀態切換時,online/offline 事件將觸發在 body 元素上,並且沿着 
    document.body、document 和 window 的順序冒泡。因此,開發者可以通過監聽它們的 online/offline 
    事件來獲悉網絡狀態。







DOM Storage


在開發支持離線功能的 Web 應用時,開發者需要在本地存儲數據。當前瀏覽器支持的 cookie 雖然也可以用來存儲數據,但是 cookie 
長度非常小(通常幾 k),而且功能有限。因此,HTML5 中新引入了 DOM Storage 機制,用於存儲 key/value 
對,它的設計目標是提供大規模、安全且易用的存儲功能。


DOM Storage 分類


DOM Storage 分爲兩類:sessionStorage 和 localStorage。除了以下區別外,這兩類存儲對象的功能是完全一致的。



  1. sessionStorage 用於存儲與當前瀏覽器窗口關聯的數據。窗口關閉後,sessionStorage 中存儲的數據將無法使用。
  2. localStorage 用於長期存儲數據。窗口關閉後,localStorage 中的數據仍然可以被訪問。所有瀏覽器窗口可以共享 
    localStorage 的數據。

DOM Storage 接口


每一個 Storage 對象都可以存儲一系列 key/value 對,Storage 接口定義爲:





 interface Storage { 
  readonly attribute unsigned long length; 
  getter DOMString key(in unsigned long index); 
  getter any getItem(in DOMString key); 
  setter creator void setItem(in DOMString key, in any data); 
  deleter void removeItem(in DOMString key); 
  void clear(); 
 }; 


其中最常用的接口是 getItem 和 setItem。getItem 用於獲取指定 key 的 value,而 setItem 用於設置指定 key 的 
value。


DOM Storage 示例


這裏給出一個使用了 sessionStorage 的例子,localStorage 的用法與它相同。首先使用 SetItem 
添加了一個名爲“userName”的項,它的值是“developerworks”。然後,調用 getItem 
得到“userName”的值,並且彈出提示框顯示它。最後,調用 removeItem 刪除“userName”。


清單 6 DOM Storage 示例代碼




				 
 <!DOCTYPE HTML> 
 <html> 
 <body> 
 <script> 
 // 在 sessionStorage 中定義'userName'變量
 sessionStorage.setItem('userName', 'developerworks');       
 // 訪問'userName'變量
 alert("Your user is: " + sessionStorage.getItem('userName')); 
 // 最後刪除'userName'
 sessionStorage.removeItem('userName');                       
 </script> 
 </body> 
 </html> 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章