離線web儲存

來源:互聯網
上載者:User

標籤:des   android   style   blog   http   io   os   使用   java   

本機快取與瀏覽器網頁的緩衝

本機快取與瀏覽器網頁緩衝的區別

離線緩衝需要 本機快取web應用程式的所有html css、 js 檔案本機快取服務於整個web應用

瀏覽器網頁緩衝只服務於單個網頁,

任何網頁都具有緩衝,而本機快取只緩衝你指定緩衝的網頁。網頁緩衝不安全、不可靠,我們不知道網站中緩衝了哪些網頁,緩衝了哪些網頁上的資源。本機快取是可靠,我們可以控制對那些沒內容進行緩衝,開發人員還可用編程的手段來控制緩衝的更新,利用緩衝對象的屬性、狀態事件開發更強大的離線web應用。

manifest檔案

  web應用的本機快取是通過每個頁面的manifest檔案進行管理的

CACHE MANIFEST   //必須的

 

#This is a comment

CACHE         //要快取檔案用於離線使用

index.html

style.css

NETWORK:   //  不進行本機快取儲存的檔案

search.php

login.php

FALLBACK:   //兩個檔案分別為能夠線上時訪問使用的資源,不能線上訪問時用的資源

/api offline.html

applicationCache對象:代表本機快取,用它來通知本機快取已被更新,也允許使用者手動更新

當瀏覽器對本機快取更新,裝入新檔案的時會觸發applicationCatche對象的updateready事件 來通知本機快取已被更新(可以用它來告訴使用者,使用者需要手工重新整理來擷取頁面的最新版本)

applicationCatche.onUpdateReady = function(){}

swapCatch方法用於手工執行本機快取的更新只能在applicationCatche的updateready事件被觸發時調用,updateReady事件只有在伺服器上的manifest檔案被修更新,且把manifest檔案中所要求的資源下載到本地時出發

    setInterval(function() {

        // 手工檢查是否有更新

        applicationCache.update();

    }, 5000);

    applicationCache.addEventListener("updateready", function() {

        if (confirm("本機快取已被更新,需要重新整理畫面來擷取應用程式最新版

本,是否重新整理?")) {

        // (3) 手工更新本機快取

            applicationCache.swapCache();

            // 重載畫面

            location.reload();

        }

    }, true);

 

applicationCatche的其他事件

function init()

{

    var msg=document.getElementById("msg");

    applicationCache.addEventListener("checking", function() {

        msg.innerHTML+="checking<br/>";

    }, true);

    applicationCache.addEventListener("noupdate", function() {

        msg.innerHTML+="noupdate<br/>";

    }, true);

    applicationCache.addEventListener("downloading", function() {

        msg.innerHTML+="downloading<br/>";

    }, true);

    applicationCache.addEventListener("progress", function() {

        msg.innerHTML+="progress<br/>";

    }, true);

    applicationCache.addEventListener("updateready", function() {

        msg.innerHTML+="updateready<br/>"; 

    }, true);

    applicationCache.addEventListener("cached", function() {

        msg.innerHTML+="cached<br/>";         

    }, true);

    applicationCache.addEventListener("error", function() {

msg.innerHTML+="error<br/>";

    }, true);

}

 

 

       HTML5近十年來發展得如火如荼,在HTML5平台上,視頻,音頻,圖象,動畫,以及同電腦的互動都被標準化。HTML功能越來越豐富,支援圖片上傳拖拽、支援localstorage、支援web sql database、支援檔案儲存體api等等。它任重而道遠,致力於將Web帶入一個更為成熟的應用平台。在所有炫酷特性中,最讓我喜歡的是它具有離線緩衝Web應用的功能。

開發離線Web 應用程式:三大核心功能

在開發支援離線的 Web 應用程式時,開發人員通常需要使用以下三個方面的功能:

1. 離線資源緩衝:需要一種方式來指明應用程式離線工作時所需的資源檔。這樣,瀏覽器才能在線上狀態時,把這些檔案快取到本地。此後,當使用者離線訪問應用程式時,這些資源檔會自動載入,從而讓使用者正常使用。HTML5 中,通過 cache manifest 檔案指明需要緩衝的資源,並支援自動和手動兩種緩衝更新方式。

2. 線上狀態檢測:開發人員需要知道瀏覽器是否線上,這樣才能夠針對線上或離線的狀態,做出對應的處理。在 HTML5 中,提供了兩種檢測當前網路是否線上的方式。

3. 本機資料儲存:離線時,需要能夠把資料存放區到本地,以便線上時同步到伺服器上。為了滿足不同的儲存需求,HTML5 提供了 DOM Storage 和 Web SQL Database 兩種儲存機制。前者提供了易用的 key/value 對儲存方式,而後者提供了基本的關聯式資料庫儲存功能。

 

離線儲存HTML5 Web SQL Database

Web SQL Database 提供了基本的關聯式資料庫功能,支援頁面上的複雜的、互動資料存放區。它既可以用來儲存使用者產生的資料,也可以作為從伺服器擷取資料的本地快取。例如可以把電子郵件、議程等資料存放區到資料庫中。Web SQL Database 支援資料庫事務的概念,從而保證了即使多個瀏覽器視窗操作同一資料,也不會產生衝突。

它還引入了一套使用 SQL 來操縱用戶端資料庫(client-side database)的 API,這些 API 是非同步(asynchronous)。所使用的 SQL 語言為 SQLite 3.6.19。其中 SQLite 是一款輕型的資料庫,佔用資源非常低,支援 Windows/Linux/Unix 等主流作業系統,同時能夠跟很多程式語言相結合,如 C#,PHP,Java,JavaScript 等,比起 Mysql,PostgreSQL 這兩款開源的資料庫管理系統來說,它的處理速度更快。目前iOS和Android平台支援運行Web SQL Database。

var db = window.openDatabase("DBName", "1.0", "description", 5*1024*1024); //5MB

 

db.transaction(function(tx) {

 

tx.executeSql("SELECT * FROM test", [], successCallback, errorCallback);

 

});

 

Web Workers

 

main.js:

 

var worker = new Worker(‘task.js‘);

 

worker.onmessage = function(event) { alert(event.data); };

 

worker.postMessage(‘data‘);

 

task.js:

 

self.onmessage = function(event) {

 

// Do some work.

 

self.postMessage("recv‘d: " + event.data);

 

};

 

 

  HTML5 IndexedDB:輕量級NoSQL資料庫

IndexedDB是HTML5-WebStorage的重要一環,是一種輕量級NoSQL資料庫。

w3c為IndexedDB定義了很多介面,其中Database對象被定義為IDBDataBase。

瀏覽器對象中,實現了IDBFactory的只有indexedDB這個執行個體。

 

五步建立HTML5離線Web應用

在HTML5提供的所有炫酷功能裡,建立離線緩衝網頁是我最喜歡的一個特性,以下是五步快速建立HTML5離線Web應用的步驟

 

1. 第一步:建立一個有效HTML5文檔,HTML5 doctype比xhtml更易於識記。

建立一個名為index.html的檔案,這裡學習如何使用CSS3來策劃網站布局。

http://www.catswhocode.com/blog/create-an-adaptable-website-layout-with-css3-media-queries

2. 新增.htaccess支援

我們要建立的快取頁面面稱為manifest檔案,假設你所使用的伺服器是Apache,我們在建立檔案之前,需要往.htaccess檔案新增一個指令。

開啟.htaccess檔案,該檔案部署在網站的根目錄下,新增以下代碼:

AddType text/cache-manifest .manifest

該指令可以確保每一個.manifest檔案文本快取。如果該檔案不存在,整個緩衝效果就無法實現,頁面也不能實現離線緩衝。

 

3. 建立.manifest檔案

在我們建立好了.manifest檔案後,事情就變得有趣多了。建立好新檔案,命名為offline.manifest,嵌入以下代碼。

CACHE MANIFEST

 

#This is a comment

 

CACHE

 

index.html

 

style.css

 

image.jpg

 

image-med.jpg

 

image-small.jpg

 

notre-dame.jpg

 

 

現在你擁有了一個完美的manifest列表。其實原理很簡單,在聲明CACHE後,你可以列出自己想要離線緩衝的檔案。這個對於緩衝一個簡單的網頁,已經是綽綽有餘了,而HTML5的緩衝有其它一些有趣的功能。

CACHE MANIFEST   //必須的

 

#This is a comment

 

CACHE         //要快取檔案用於離線使用

 

index.html

 

style.css

 

NETWORK:   //  不進行本機快取儲存的檔案

 

search.php

 

login.php

 

FALLBACK:   //兩個檔案分別為能夠線上時訪問使用的資源,不能線上訪問時用的資源

 

/api offline.html

 

在這個樣本中,manifest檔案聲明了CACHE,用於緩衝index.html和style.css。同時,我們聲明了NETWORK,用於指定不被緩衝的檔案,比如登入頁面。

最後聲明的是FALLBACK,這個聲明允許將使用者轉入一個指定的頁面,比如本例中如果不打算離線查看API資源的話,可以轉向Off.html頁面。

 

4. 將manifest 檔案連結到HTML文檔中。

在manifest檔案和主要的html文檔準備好了以後,你唯一還需要做的事情是將manifest檔案連結到html文檔中。

操作方法很簡單,只需在html元算中添加manifest 屬性,代碼如下:

 

 

本機資料庫

 1.建立訪問資料庫的對象                  //var db = openDatabase(‘mysql‘,‘1.0‘,‘Test DB‘,2*1024*1024) 當資料庫不存在時會建立資料庫

2.使用交易處理                                   //訪問資料庫調用transaction方法執行交易處理  參數為一個回呼函數

Eg bd.transaction(function(tx){

         tx.executeSql(‘CREATE TABLE IF NOT EXISTS MsgData(name TEXT, message TEXT, time INTEGER)‘,[]); 

        tx.executeSql(‘SELECT * FROM MsgData‘, [], function(tx, rs)

        { //removeAllData(); 

            for(var i = 0; i < rs.rows.length; i++)

            { 

                showData(rs.rows.item(i)); 

            } 

        });  });  });

Tx.executeSql(‘sql參數用?‘,[為?賦值],funsuccess,funerror)

 

本機快取通過每個頁面的mainfest檔案來管理。 

瀏覽器和伺服器的互動過程: 

  瀏覽器請求URL->伺服器返回頁面->瀏覽器解析頁面->伺服器返回所有資源->瀏覽器處理mainfest檔案->伺服器返回所有要求本機快取的檔案->瀏覽器對本機快取進行更新 

  瀏覽器再次請求URL->瀏覽器發現緩衝->瀏覽器解析快取頁面面->瀏覽器請求mainfest->(無更新)伺服器返回304(【如果已更新】->瀏覽器再次請求URL->瀏覽器發現快取頁面面->瀏覽器解析快取頁面面->瀏覽器請求mainfest檔案->伺服器返回更新過的mainfest->瀏覽器處理mainfest->瀏覽器返回本機快取->瀏覽器對本機快取進行更新) 

【緩衝更新在本機快取更新完還是不能用,只有重新開啟這個頁面的時候才能使用更新過的資源檔】 

      通過觸發applicationCache對象的onUpdateReady事件,告訴使用者本機快取已經被更新,需手工重新整理頁面來得到最新版本的應用程式。 

    通過觸發applicationCache對象的swapcache方法手工執行本機快取更新操作,他只能在applicationCache對象的updataReady事件裡被觸發調用。 

離線web儲存

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.