您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)HTML5如何實(shí)現(xiàn)離線存儲(chǔ)功能的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。
HTML5 離線功能介紹
HTML5 是目前正在討論的新一代 HTML 標(biāo)準(zhǔn),它代表了現(xiàn)在 Web 領(lǐng)域的最新發(fā)展方向。在 HTML5 標(biāo)準(zhǔn)中,加入了新的多樣的內(nèi)容描述標(biāo)簽,直接支持表單驗(yàn)證、視頻音頻標(biāo)簽、網(wǎng)頁(yè)元素的拖拽、離線存儲(chǔ)和工作線程等功能。其中一個(gè)新特性就是對(duì)離線應(yīng)用開(kāi)發(fā)的支持。
在開(kāi)發(fā)支持離線的 Web 應(yīng)用程序時(shí),開(kāi)發(fā)者通常需要使用以下三個(gè)方面的功能:
1. 離線資源緩存:需要一種方式來(lái)指明應(yīng)用程序離線工作時(shí)所需的資源文件。這樣,瀏覽器才能在在線狀態(tài)時(shí),把這些文件緩存到本地。此后,當(dāng)用戶離線訪問(wèn)應(yīng)用程序時(shí),這些資源文件會(huì)自動(dòng)加載,從而讓用戶正常使用。HTML5 中,通過(guò) cache manifest 文件指明需要緩存的資源,并支持自動(dòng)和手動(dòng)兩種緩存更新方式。
2. 在線狀態(tài)檢測(cè):開(kāi)發(fā)者需要知道瀏覽器是否在線,這樣才能夠針對(duì)在線或離線的狀態(tài),做出對(duì)應(yīng)的處理。在 HTML5 中,提供了兩種檢測(cè)當(dāng)前網(wǎng)絡(luò)是否在線的方式。
3. 本地?cái)?shù)據(jù)存儲(chǔ):離線時(shí),需要能夠把數(shù)據(jù)存儲(chǔ)到本地,以便在線時(shí)同步到服務(wù)器上。為了滿足不同的存儲(chǔ)需求,HTML5 提供了 DOM Storage 和 Web SQL Database 兩種存儲(chǔ)機(jī)制。前者提供了易用的 key/value 對(duì)存儲(chǔ)方式,而后者提供了基本的關(guān)系數(shù)據(jù)庫(kù)存儲(chǔ)功能。
盡管 HTML5 還處于草稿狀態(tài),但是各大主流瀏覽器都已經(jīng)實(shí)現(xiàn)了其中的很多功能。Chrome、Firefox、Safari 和 Opera 的最新版本都對(duì) HTML5 離線功能提供了完整的支持。IE8 也支持了其中的在線狀態(tài)檢測(cè)和 DOM Storage 功能。下面將具體介紹 HTML5 離線功能中的離線資源緩存、在線狀態(tài)檢測(cè)、DOM Storage 和 Web SQL Database,最后通過(guò)一個(gè)簡(jiǎn)單的 Web 程序說(shuō)明使用 HTML5 開(kāi)發(fā)離線應(yīng)用的方法。
回頁(yè)首
離線資源緩存
為了能夠讓用戶在離線狀態(tài)下繼續(xù)訪問(wèn) Web 應(yīng)用,開(kāi)發(fā)者需要提供一個(gè) cache manifest 文件。這個(gè)文件中列出了所有需要在離線狀態(tài)下使用的資源,瀏覽器會(huì)把這些資源緩存到本地。本節(jié)先通過(guò)一個(gè)例子展示 cache manifest 文件的用途,然后詳細(xì)描述其書寫方法,最后說(shuō)明緩存的更新方式。
cache manifest 示例
我們通過(guò) W3C 提供的示例來(lái)說(shuō)明。Clock Web 應(yīng)用由三個(gè)文件“clock.html”、“clock.css”和“clock.js”組成。
清單 1. Clock 應(yīng)用代碼
<!-- 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);
當(dāng)用戶在離線狀態(tài)下訪問(wèn)“clock.html”時(shí),頁(yè)面將無(wú)法展現(xiàn)。為了支持離線訪問(wèn),開(kāi)發(fā)者必須添加 cache manifest 文件,指明需要緩存的資源。這個(gè)例子中的 cache manifest 文件為“clock.manifest”,它聲明了 3 個(gè)需要緩存的資源文件“clock.html”、“clock.css”和“clock.js”。
清單 2. clock.manifest 代碼
CACHE MANIFEST
clock.html
clock.css
clock.js
添加了 cache manifest 文件后,還需要修改“clock.html”,把 <html> 標(biāo)簽的 manifest 屬性設(shè)置為“clock.manifest”。修改后的“clock.html”代碼如下。
清單 3. 設(shè)置 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>
修改后,當(dāng)用戶在線訪問(wèn)“clock.html”時(shí),瀏覽器會(huì)緩存“clock.html”、“clock.css”和“clock.js”文件;而當(dāng)用戶離線訪問(wèn)時(shí),這個(gè) Web 應(yīng)用也可以正常使用了。
cache manifest 格式
下面說(shuō)明書寫 cache manifest 文件需要遵循的格式。
1. 首行必須是 CACHE MANIFEST。
2. 其后,每一行列出一個(gè)需要緩存的資源文件名。
3. 可根據(jù)需要列出在線訪問(wèn)的白名單。白名單中的所有資源不會(huì)被緩存,在使用時(shí)將直接在線訪問(wèn)。聲明白名單使用 NETWORK:標(biāo)識(shí)符。
4. 如果在白名單后還要補(bǔ)充需要緩存的資源,可以使用 CACHE:標(biāo)識(shí)符。
5. 如果要聲明某 URI 不能訪問(wèn)時(shí)的替補(bǔ) URI,可以使用 FALLBACK:標(biāo)識(shí)符。其后的每一行包含兩個(gè) URI,當(dāng)?shù)谝粋€(gè) URI 不可訪問(wèn)時(shí),瀏覽器將嘗試使用第二個(gè) URI。
6. 注釋要另起一行,以 # 號(hào)開(kāi)頭。
清單 4 的代碼中給出了 cache manifest 中各類標(biāo)識(shí)符的使用示例。
清單 4. cache manifest 示例代碼
CACHE MANIFEST
# 上一行是必須書寫的。
images/sound-icon.png
images/background.png
NETWORK:
comm.cgi
# 下面是另一些需要緩存的資源,在這個(gè)示例中只有一個(gè) css 文件。
CACHE:
style/default.css
FALLBACK:
/files/projects /projects
更新緩存
應(yīng)用程序可以等待瀏覽器自動(dòng)更新緩存,也可以使用 Javascript 接口手動(dòng)觸發(fā)更新。
1. 自動(dòng)更新
瀏覽器除了在第一次訪問(wèn) Web 應(yīng)用時(shí)緩存資源外,只會(huì)在 cache manifest 文件本身發(fā)生變化時(shí)更新緩存。而 cache manifest 中的資源文件發(fā)生變化并不會(huì)觸發(fā)更新。
2. 手動(dòng)更新
開(kāi)發(fā)者也可以使用 window.applicationCache 的接口更新緩存。方法是檢測(cè) window.applicationCache.status 的值,如果是 UPDATEREADY,那么可以調(diào)用 window.applicationCache.update() 更新緩存。示范代碼如下。
清單 5 手動(dòng)更新緩存
if (window.applicationCache.status == window.applicationCache.UPDATEREADY)
{
window.applicationCache.update();
}
回頁(yè)首
在線狀態(tài)檢測(cè)
如果 Web 應(yīng)用程序僅僅是一些靜態(tài)頁(yè)面的組合,那么通過(guò) cache manifest 緩存資源文件以后,就可以支持離線訪問(wèn)了。但是隨著互聯(lián)網(wǎng)的發(fā)展,特別是 Web2.0 概念流行以來(lái),用戶的提交的數(shù)據(jù)漸漸成為互聯(lián)網(wǎng)的主流。那么在開(kāi)發(fā)支持離線的 Web 應(yīng)用時(shí),就不能僅僅滿足于靜態(tài)頁(yè)面的展現(xiàn),還必需考慮如何讓用戶在離線狀態(tài)下也可以操作數(shù)據(jù)。離線狀態(tài)時(shí),把數(shù)據(jù)存儲(chǔ)在本地;在線以后,再把數(shù)據(jù)同步到服務(wù)器上。為了做到這一點(diǎn),開(kāi)發(fā)者首先必須知道瀏覽器是否在線。HTML5 提供了兩種檢測(cè)是否在線的方式:navigator.online 和 online/offline 事件。
1. navigator.onLine
navigator.onLine 屬性表示當(dāng)前是否在線。如果為 true, 表示在線;如果為 false, 表示離線。當(dāng)網(wǎng)絡(luò)狀態(tài)發(fā)生變化時(shí),navigator.onLine 的值也隨之變化。開(kāi)發(fā)者可以通過(guò)讀取它的值獲取網(wǎng)絡(luò)狀態(tài)。
2. online/offline 事件
當(dāng)開(kāi)發(fā)離線應(yīng)用時(shí),通過(guò) navigator.onLine 獲取網(wǎng)絡(luò)狀態(tài)通常是不夠的。開(kāi)發(fā)者還需要在網(wǎng)絡(luò)狀態(tài)發(fā)生變化時(shí)立刻得到通知,因此 HTML5 還提供了 online/offline 事件。當(dāng)在線 / 離線狀態(tài)切換時(shí),online/offline 事件將觸發(fā)在 body 元素上,并且沿著 document.body、document 和 window 的順序冒泡。因此,開(kāi)發(fā)者可以通過(guò)監(jiān)聽(tīng)它們的 online/offline 事件來(lái)獲悉網(wǎng)絡(luò)狀態(tài)。
回頁(yè)首
DOM Storage
在開(kāi)發(fā)支持離線功能的 Web 應(yīng)用時(shí),開(kāi)發(fā)者需要在本地存儲(chǔ)數(shù)據(jù)。當(dāng)前瀏覽器支持的 cookie 雖然也可以用來(lái)存儲(chǔ)數(shù)據(jù),但是 cookie 長(zhǎng)度非常?。ㄍǔ?k),而且功能有限。因此,HTML5 中新引入了 DOM Storage 機(jī)制,用于存儲(chǔ) key/value 對(duì),它的設(shè)計(jì)目標(biāo)是提供大規(guī)模、安全且易用的存儲(chǔ)功能。
DOM Storage 分類
DOM Storage 分為兩類:sessionStorage 和 localStorage。除了以下區(qū)別外,這兩類存儲(chǔ)對(duì)象的功能是完全一致的。
1. sessionStorage 用于存儲(chǔ)與當(dāng)前瀏覽器窗口關(guān)聯(lián)的數(shù)據(jù)。窗口關(guān)閉后,sessionStorage 中存儲(chǔ)的數(shù)據(jù)將無(wú)法使用。
2. localStorage 用于長(zhǎng)期存儲(chǔ)數(shù)據(jù)。窗口關(guān)閉后,localStorage 中的數(shù)據(jù)仍然可以被訪問(wèn)。所有瀏覽器窗口可以共享 localStorage 的數(shù)據(jù)。
DOM Storage 接口
每一個(gè) Storage 對(duì)象都可以存儲(chǔ)一系列 key/value 對(duì),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 用于設(shè)置指定 key 的 value。
DOM Storage 示例
這里給出一個(gè)使用了 sessionStorage 的例子,localStorage 的用法與它相同。首先使用 SetItem 添加了一個(gè)名為“userName”的項(xiàng),它的值是“developerworks”。然后,調(diào)用 getItem 得到“userName”
感謝各位的閱讀!關(guān)于“HTML5如何實(shí)現(xiàn)離線存儲(chǔ)功能”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。