js前端開(kāi)發(fā)—離線應(yīng)用篇—離線檢測(cè)和應(yīng)用緩存

參考資料

《Javascript高級(jí)層序設(shè)計(jì)》(第3版)
JavaScript | MDN
HTML5系列之——applicationCache對(duì)象

前言

本人菜鳥(niǎo),入IT只為當(dāng)鼓勵(lì)師。本編文章主要介紹 如何判斷設(shè)備是在線還是離線 (navigator.onLine 屬性睡扬,online和offline事件)墩弯,如何實(shí)現(xiàn)應(yīng)用緩存(描述文件即彪,<html>的mainfest屬性街州,applicationCache對(duì)象)晴音。

一刑顺、什么是離線Web應(yīng)用

  • 離線Web應(yīng)用见坑,就是在設(shè)備不能上網(wǎng)的情況下仍然可以運(yùn)行的應(yīng)用。
  • 離線Web應(yīng)用是 HTML5 新增的一個(gè)重點(diǎn)技術(shù)捏检。

二荞驴、開(kāi)發(fā)離線應(yīng)用的條件

  • 能夠判斷出設(shè)備是在線還是離線
  • 能夠訪問(wèn)一定的資源(css、JavaScript贯城、圖像等)
  • 必須有一塊本地(客戶端)空間用于保存數(shù)據(jù)

三熊楼、使用HTML5開(kāi)發(fā)離線應(yīng)用

1. 離線檢測(cè)

1.1 navigator.onLine 屬性

  • 為了判斷設(shè)備是否在線,HTML5 定義了一個(gè) navigator.onLine 屬性
  • navigator.onLine 是一個(gè)只讀屬性能犯,它返回一個(gè) Boolean 值:
    true —— 表示 設(shè)備能上網(wǎng)鲫骗,即設(shè)備在線;
    false —— 表示 設(shè)備離線踩晶。
  • 下面這段代碼能在IE6+和Safari 5+正常執(zhí)行执泰;在Chrome11及之前的版本中,navigator.onLine 的值始終為 true渡蜻,但早在2011年10月出的新版就已經(jīng)解決了這個(gè)bug术吝。Firefox 4 + 和 Opera 11.10 +,支持該屬性茸苇,但必須手工選中菜單項(xiàng)“文件——>Web開(kāi)發(fā)人員(設(shè)置)——>脫機(jī)工作”才能讓瀏覽器正常工作排苍。
<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <title>判斷設(shè)備是否能上網(wǎng)</title>
</head>
<body>
    <p>你現(xiàn)在的狀態(tài)是 <script>document.write(navigator.onLine ? "在線" : "離線");</script></p>
</body>
</html>
各個(gè)瀏覽器對(duì) navigator.online 的兼容性

1.2 online 和 offline 事件

  • 為了更好的確定網(wǎng)絡(luò)是否可用,HTML5還定義了兩個(gè)事件:onlineoffline学密。
  • online 事件:當(dāng)網(wǎng)絡(luò)從離線變?yōu)樵诰€時(shí)觸發(fā)淘衙;(IE9+瀏覽器支持)
    offline 事件:當(dāng)網(wǎng)絡(luò)從在線變?yōu)殡x線時(shí)觸發(fā)。(IE9+瀏覽器支持)
  • 這兩個(gè)事件在window對(duì)象上觸發(fā)腻暮。
  • 為了檢測(cè)應(yīng)用是否離線彤守,在頁(yè)面加載后毯侦,最好先通過(guò) navigator.onLine 取得初始的狀態(tài),然后通過(guò)上述兩個(gè)事件來(lái)確定網(wǎng)絡(luò)連接狀態(tài)是否變化具垫。下面代碼是實(shí)現(xiàn)兼容性最優(yōu)的方案侈离。
  • 代碼中用到 EventUtil.js 文件,它提供了一個(gè)兼容所有瀏覽器的事件綁定對(duì)象做修』粽可點(diǎn)擊藍(lán)色字體從我的github中下載該文件抡草。
<!DOCTYPE html>
<html>
<head>
    <title>Online Events Example</title>
<script type="text/javascript" src="EventUtil.js"></script>
</head>
<body>
    <p>你現(xiàn)在的狀態(tài)是 <span id="status"><script>document.write(navigator.onLine ? "在線" : "離線");</script></span></p>
    <script>
        EventUtil.addHandler(window, "online", function(){
            document.getElementById("status").innerHTML = "在線";
        });
        EventUtil.addHandler(window, "offline", function(){
            document.getElementById("status").innerHTML = "離線";
        });
    </script>
</body>
</html>
各種兼容性問(wèn)題

2. 應(yīng)用緩存

HTML5的應(yīng)用緩存饰及,簡(jiǎn)稱為appcache。Appcache就是從瀏覽器的緩存中分出來(lái)的一塊緩存區(qū)康震×呛可以使用一個(gè)描述文件(manifest file),列出要下載和緩存的資源腿短,這樣就能在這個(gè)緩存中保存數(shù)據(jù)了屏箍。

2.1 檢測(cè)瀏覽器是否支持應(yīng)用緩存

if (window.applicationCache) {
    //瀏覽器支持離線應(yīng)用
}

2.2 描述文件

  • 描述文件用來(lái)列出需要緩存和不需要緩存的資源,以備離線時(shí)使用橘忱。
  • 描述文件的擴(kuò)展名以前用.manifest赴魁,現(xiàn)在推薦使用.appcache,并且描述文件需要配置正確的MIME-type钝诚,即"text/cache-manifest"颖御,必須在web服務(wù)器上進(jìn)行配置(文件編碼必須是UTF-8)。
  • 具體格式:


2.3 將描述文件和頁(yè)面關(guān)聯(lián)

<html manifest='./offline.appcche'>

2.4 window.applicationCache 對(duì)象

2.4.1 status屬性
  • applicationCache 有一個(gè) status 屬性凝颇,屬性值是常量:
2.4.2 可綁定在applicationCache對(duì)象上的事件
  • applicationCache 還有很多相關(guān)的事件:
2.4.3 update() 方法
  • applicationCache 對(duì)象的 update() 方法:
    通過(guò)update()方法也可以手工干預(yù)潘拱,讓?xiě)?yīng)用緩存為檢查更新而觸發(fā)上述事

     applicationCache.update();
    

update()一經(jīng)調(diào)用,應(yīng)用緩存就會(huì)去檢查描述文件是否更新拧略,觸發(fā)checking事件芦岂,然后頁(yè)面就會(huì)像剛剛加載一樣,繼續(xù)執(zhí)行后續(xù)操作垫蛆。如果觸發(fā)了cached事件禽最,則說(shuō)明應(yīng)用緩存已經(jīng)準(zhǔn)備就緒,不會(huì)再發(fā)生其他操作袱饭。

2.4.4 swapCache()方法

如果觸發(fā)了updateready事件弛随,則說(shuō)明新版本的應(yīng)用緩存已經(jīng)可用,需要調(diào)用swapCache()方法來(lái)啟用新的應(yīng)用緩存宁赤。

applicationCache.onupdateready = function(){
    applicationCache.swapCache();
};
2.4.5 注意事項(xiàng)

瀏覽器檢查清單文件舀透,以及更新緩存的操作是異步的,因此可能是在載入舊緩存之后進(jìn)行决左,因此可能需要載入兩次才能顯示最新的內(nèi)容愕够,因此需要提示用戶走贪。

window.applicationCache.onupdateready = function(){
    var con = comfirm('有新內(nèi)容可用,是否重新加載惑芭?');
    if(con){
        location.reload();
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末坠狡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子遂跟,更是在濱河造成了極大的恐慌逃沿,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件幻锁,死亡現(xiàn)場(chǎng)離奇詭異凯亮,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)哄尔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)假消,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人岭接,你說(shuō)我怎么就攤上這事富拗。” “怎么了鸣戴?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵啃沪,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我窄锅,道長(zhǎng)创千,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任酬滤,我火速辦了婚禮签餐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘盯串。我一直安慰自己氯檐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布体捏。 她就那樣靜靜地躺著冠摄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪几缭。 梳的紋絲不亂的頭發(fā)上河泳,一...
    開(kāi)封第一講書(shū)人閱讀 51,562評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音年栓,去河邊找鬼拆挥。 笑死,一個(gè)胖子當(dāng)著我的面吹牛某抓,可吹牛的內(nèi)容都是我干的纸兔。 我是一名探鬼主播惰瓜,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼汉矿!你這毒婦竟也來(lái)了崎坊?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤洲拇,失蹤者是張志新(化名)和其女友劉穎奈揍,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體赋续,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡男翰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蚕捉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奏篙。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡柴淘,死狀恐怖迫淹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情为严,我是刑警寧澤敛熬,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站第股,受9級(jí)特大地震影響应民,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜夕吻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一诲锹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧涉馅,春花似錦归园、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至晤揣,卻和暖如春桥爽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背昧识。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工钠四, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人跪楞。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓缀去,卻偏偏與公主長(zhǎng)得像环疼,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子朵耕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • HTML5新增了離線應(yīng)用炫隶,離線應(yīng)用使得我們可以在網(wǎng)頁(yè)或應(yīng)用在沒(méi)有網(wǎng)絡(luò)的情況下依然可以使用。離線應(yīng)用的使用需要以下幾...
    SuperSnail閱讀 6,940評(píng)論 2 15
  • Web應(yīng)用與傳統(tǒng)客戶端最大的區(qū)別就是需要連接網(wǎng)絡(luò)阎曹,沒(méi)有網(wǎng)絡(luò)整個(gè)應(yīng)用就無(wú)法運(yùn)行伪阶,這個(gè)一直是Web應(yīng)用最大的痛點(diǎn)之一。...
    exialym閱讀 388評(píng)論 0 7
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理处嫌,服務(wù)發(fā)現(xiàn)栅贴,斷路器,智...
    卡卡羅2017閱讀 134,657評(píng)論 18 139
  • 0 總結(jié) 本書(shū)的JS 第一章有講語(yǔ)法有挺多常見(jiàn)的坑點(diǎn)和原理解釋很不錯(cuò) 第二章DOM編程講述了挺多API 第三章事件...
    王鈺峰閱讀 1,498評(píng)論 0 9
  • 請(qǐng)參看我github中的wiki熏迹,不定期更新檐薯。https://github.com/ivonzhang/Front...
    zhangivon閱讀 7,127評(píng)論 2 19