<s id="2e0qm"><div id="2e0qm"></div></s>
<div id="2e0qm"><button id="2e0qm"></button></div>
<small id="2e0qm"></small>
<div id="2e0qm"></div>
<div id="2e0qm"><s id="2e0qm"></s></div>
<div id="2e0qm"><button id="2e0qm"></button></div>
主頁 > 知識庫 > 網頁基礎 > HTML >

HTML5離線功應用能詳解

來源:中國IT實驗室 作者:佚名 發表于:2013-03-12 12:49  點擊:
簡介: Web2.0 技術鼓勵個人的參與,每個人都是 Web 內容的撰寫者。如果 Web 應用能夠提供離線的功能,讓用戶在沒有網絡的地方(例如飛機上)和時候(網絡壞了),也能進行內容撰寫,等到有網絡的時候,再同步到 Web 上,就大大方便了用戶的使用。HTML5 作為
簡介: Web2.0 技術鼓勵個人的參與,每個人都是 Web 內容的撰寫者。如果 Web 應用能夠提供離線的功能,讓用戶在沒有網絡的地方(例如飛機上)和時候(網絡壞了),也能進行內容撰寫,等到有網絡的時候,再同步到 Web 上,就大大方便了用戶的使用。HTML5 作為新一代的 HTML 標準,包含了對離線功能的支持。本文介紹了 HTML5 離線功能中的離線資源緩存、在線狀態檢測、本地數據存儲等內容,并舉例說明了如何使用 HTML5 的新特性開發離線應用。
  •  
  •     HTML5 離線功能介紹
  •     HTML5 是目前正在討論的新一代 HTML 標準,它代表了現在 Web 領域的最新發展方向。在 HTML5 標準中,加入了新的多樣的內容描述標簽,直接支持表單驗證、視頻音頻標簽、網頁元素的拖拽、離線存儲和工作線程等功能。其中一個新特性就是對離線應用開發的支持。
  •     在開發支持離線的 Web 應用程序時,開發者通常需要使用以下三個方面的功能:
  •     離線資源緩存:需要一種方式來指明應用程序離線工作時所需的資源文件。這樣,瀏覽器才能在在線狀態時,把這些文件緩存到本地。此后,當用戶離線訪問應用程 序時,這些資源文件會自動加載,從而讓用戶正常使用。HTML5 中,通過 cache manifest 文件指明需要緩存的資源,并支持自動和手動兩種緩存更新方式。
  •     在線狀態檢測:開發者需要知道瀏覽器是否在線,這樣才能夠針對在線或離線的狀態,做出對應的處理。在 HTML5 中,提供了兩種檢測當前網絡是否在線的方式。
  •     本地數據存儲:離線時,需要能夠把數據存儲到本地,以便在線時同步到服務器上。為了滿足不同的存儲需求,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 應用代碼
  •     XML/HTML Code復制內容到剪貼板
  •     <!-- 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 代碼
  •     XML/HTML Code復制內容到剪貼板
  •     CACHE MANIFEST
  •     clock.html
  •     clock.css
  •     clock.js
  •     添加了 cache manifest 文件后,還需要修改“clock.html”,把 <html> 標簽的 manifest 屬性設置為“clock.manifest”。修改后的“clock.html”代碼如下。
  •     清單 3. 設置 manifest 后的 clock.html 代碼
  •     XML/HTML Code復制內容到剪貼板
  •     <!-- 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 文件需要遵循的格式。
  •     首行必須是 CACHE MANIFEST。
  •     其后,每一行列出一個需要緩存的資源文件名。
  •     可根據需要列出在線訪問的白名單。白名單中的所有資源不會被緩存,在使用時將直接在線訪問。聲明白名單使用 NETWORK:標識符。
  •     如果在白名單后還要補充需要緩存的資源,可以使用 CACHE:標識符。
  •     如果要聲明某 URI 不能訪問時的替補 URI,可以使用 FALLBACK:標識符。其后的每一行包含兩個 URI,當第一個 URI 不可訪問時,瀏覽器將嘗試使用第二個 URI。
  •     注釋要另起一行,以 # 號開頭。
  •     清單 4 的代碼中給出了 cache manifest 中各類標識符的使用示例。
  •     清單 4. cache manifest 示例代碼
  •     XML/HTML Code復制內容到剪貼板
  •     CACHE MANIFEST
  •     # 上一行是必須書寫的。
  •     images/sound-icon.png
  •     images/background.png
  •     NETWORK:
  •     comm.cgi
  •     # 下面是另一些需要緩存的資源,在這個示例中只有一個 css 文件。
  •     XML/HTML Code復制內容到剪貼板
  •     CACHE:
  •     style/default.css
  •     FALLBACK:
  •     /files/projects /projects
  •     更新緩存
  •     應用程序可以等待瀏覽器自動更新緩存,也可以使用 Javascript 接口手動觸發更新。
  •     自動更新
  •     瀏覽器除了在第一次訪問 Web 應用時緩存資源外,只會在 cache manifest 文件本身發生變化時更新緩存。而 cache manifest 中的資源文件發生變化并不會觸發更新。
  •     手動更新
  •     開發者也可以使用 window.applicationCache 的接口更新緩存。方法是檢測 window.applicationCache.status 的值,如果是 UPDATEREADY,那么可以調用 window.applicationCache.update() 更新緩存。示范代碼如下。
  •     清單 5 手動更新緩存
  •     JavaScript Code復制內容到剪貼板
  •     if (window.applicationCache.status == window.applicationCache.UPDATEREADY)
  •     {
  •     window.applicationCache.update();
  •     }
  •     在線狀態檢測
  •     如果 Web 應用程序僅僅是一些靜態頁面的組合,那么通過 cache manifest 緩存資源文件以后,就可以支持離線訪問了。但是隨著互聯網的發展,特別是 Web2.0 概念流行以來,用戶的提交的數據漸漸成為互聯網的主流。那么在開發支持離線的 Web 應用時,就不能僅僅滿足于靜態頁面的展現,還必需考慮如何讓用戶在離線狀態下也可以操作數據。離線狀態時,把數據存儲在本地;在線以后,再把數據同步到服務器上。為了做到這一點,開發者首先必須知道瀏覽器是否在線。HTML5 提供了兩種檢測是否在線的方式:navigator.online 和 online/offline 事件。
  •     navigator.onLine
  •     navigator.onLine 屬性表示當前是否在線。如果為 true, 表示在線;如果為 false, 表示離線。當網絡狀態發生變化時,navigator.onLine 的值也隨之變化。開發者可以通過讀取它的值獲取網絡狀態。
  •     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。除了以下區別外,這兩類存儲對象的功能是完全一致的。
  •     sessionStorage 用于存儲與當前瀏覽器窗口關聯的數據。窗口關閉后,sessionStorage 中存儲的數據將無法使用。
  •     localStorage 用于長期存儲數據。窗口關閉后,localStorage 中的數據仍然可以被訪問。所有瀏覽器窗口可以共享 localStorage 的數據。
  •     DOM Storage 接口
  •     每一個 Storage 對象都可以存儲一系列 key/value 對,Storage 接口定義為:
  •     JavaScript Code復制內容到剪貼板
  •     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 示例代碼
  •     XML/HTML Code復制內容到剪貼板
  •     <!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>
  •     Web SQL Database
  •     除了 DOM Storage 以外,HTML5 中還有另外一種數據存儲方式 Web SQL Database。它提供了基本的關系數據庫功能,支持頁面上的復雜的、交互式的數據存儲。它既可以用來存儲用戶產生的數據,也可以作為從服務器獲取數據 的本地高速緩存。例如可以把電子郵件、日程等數據存儲到數據庫中。Web SQL Database 支持數據庫事務的概念,從而保證了即使多個瀏覽器窗口操作同一數據,也不會產生沖突。
  •     Web SQL Database 基本用法
  •     創建和打開數據庫
  •     使用數據庫的第一步是創建并打開數據庫,API 是 openDatabase。當數據庫已經存在時,openDatabase 僅僅打開數據庫;如果這個數據庫不存在,那么就創建一個空數據庫并且打開它。openDatabase 的定義是:
  •     JavaScript Code復制內容到剪貼板
  •     Database openDatabase(in DOMString name, in DOMString version,
  •     in DOMString displayName, in unsigned long estimatedSize,
  •     in optional DatabaseCallback creationCallback);
  •     name:數據庫名。
  •     version:數據庫版本。
  •     displayName:顯示名稱。
  •     estimatedSize:數據庫預估長度(以字節為單位)。
  •     creationCallback:回調函數。
  •     執行事務處理
  •     在打開數據庫以后,就可以使用事務 API transaction。每一個事務作為操作數據庫的原子操作,不會被打斷,從而避免了數據沖突。transaction 的定義是:
  •     JavaScript Code復制內容到剪貼板
  •     void transaction(in SQLTransactionCallback callback,
  •     in optional SQLTransactionErrorCallback errorCallback,
  •     in optional SQLVoidCallback successCallback);
  •     callback:事務回調函數,其中可以執行 SQL 語句。
  •     errorCallback:出錯回調函數。
  •     successCallback:執行成功回調函數。
  •     執行 SQL 語句
  •     在事務的回調函數 callback 中,可以執行 SQL 語句,API 是 executeSQL。executeSQL 的定義是:
  •     JavaScript Code復制內容到剪貼板
  •     void executeSql(in DOMString sqlStatement,
  •     in optional ObjectArray arguments, in optional SQLStatementCallback callback,
  •     in optional SQLStatementErrorCallback errorCallback);
  •     sqlStatement:SQL 語句。
  •     arguments:SQL 語句需要的參數。
  •     callback:回調函數。
  •     errorCallback:出錯回調函數。
  •     Web SQL Database 示例
  •     下面通過一個例子說明 Web SQL Database 的基本用法。它首先調用 openDatabase 創建了名為“fooDB”的數據庫。然后使用 transaction 執行兩條 SQL 語句。第一條 SQL 語句創建了名為“foo”的表,第二條 SQL 語句向表中插入一條記錄。
  •     清單 7 Web SQL Database 示例代碼
  •     JavaScript Code復制內容到剪貼板
  •     var db = openDatabase('fooDB', '1.0', 'fooDB', 2 * 1024);
  •     db.transaction(function (tx) {
  •     tx.executeSql('CREATE TABLE IF NOT EXISTS foo (id unique, text)');
  •     tx.executeSql('INSERT INTO foo (id, text) VALUES (1, "foobar")');
  •     });

有幫助
(0)
0%
沒幫助
(1)
100%
真人女荫道口100种图片
<s id="2e0qm"><div id="2e0qm"></div></s>
<div id="2e0qm"><button id="2e0qm"></button></div>
<small id="2e0qm"></small>
<div id="2e0qm"></div>
<div id="2e0qm"><s id="2e0qm"></s></div>
<div id="2e0qm"><button id="2e0qm"></button></div>