99热99这里只有精品6国产,亚洲中文字幕在线天天更新,在线观看亚洲精品国产福利片 ,久久久久综合网

歡迎加入QQ討論群258996829
麥子學(xué)院 頭像
蘋果6袋
6
麥子學(xué)院

HTML5離線存儲詳

發(fā)布時間:2016-10-11 23:26  回復(fù):0  查看:13836   最后回復(fù):2016-10-11 23:26  

STORAGE(存儲)

  Cookie

  在HTML5技術(shù)以前我們會使用 cookie,在瀏覽器端緩存一些數(shù)據(jù),例如:登錄用戶信息,歷史搜索信息等等。但是cookie所支持的容量僅僅只有 4k ,也沒有專門的api來操作,只能依賴一些開源的庫, 這里使用 cookies.js 存儲和獲取cookie信息

  // 這是一個cookie

  Cookies.set('key', 'value');

  // 鏈?zhǔn)秸{(diào)用

  Cookies.set('key', 'value').set('hello', 'world');

  // 可以額外設(shè)置一些參數(shù)

  Cookies.set('key', 'value', { domain: 'www.example.com', secure: true });

  // 設(shè)置緩存時間

  Cookies.set('key', 'value', { expires: 600 }); // Expires in 10 minutes

  Cookies.set('key', 'value', { expires: '01/01/2012' });

  Cookies.set('key', 'value', { expires: new Date(2012, 0, 1) });

  Cookies.set('key', 'value', { expires: Infinity });

  // 獲取

  Cookies.get('key');

  由此可見用cookie存儲有一下幾個缺點:

  存儲數(shù)據(jù)的量比較小

  本身沒有方便的api對其進行操作

  cookie信息會在http請求時加入到請求頭中,既不安全也增加了帶寬。

  WEB Storage

  HTML5 提拱更好的本地存儲規(guī)范 localStorage 和 sessionStorage , 它們將數(shù)據(jù)存儲在本地,而且在http請求時不會攜帶 Storage 里的信息使用方式也很簡單:

  localStorage.setItem('key', 'value');

  localStorage.getItem('key');

  localStorage.removeItem('key');

  sessionStorage.setItem('key', 'value');

  sessionStorage.getItem('key');

  sessionStorage.removeItem('key');

  sessionStorage 和 localStorage 使用方式及特性基本一致,唯一的區(qū)別是, sessionStorage 只在會話內(nèi)有效,當(dāng)瀏覽器窗口關(guān)閉,sessionStorage 緩存的數(shù)據(jù)會自動被清除, 而 localStorage 只要不手動清除,它會永久保存在本地。

  這里有張圖片分析了 cookie 、 localStorage 、 sessionStorage 三者的區(qū)別

HTML5離線存儲詳

OFFLINE(離線)

  為了讓 webapp 擁有像 native app 一樣的功能和體驗, 在 HTML5的規(guī)范中加入了許多新的api, 讓頁面可以在離線環(huán)境下正常訪問。 service worker 和 indexedDB 兩者配合可以就可以開發(fā)離線使用的 webapp 了,由于 service worker 目前的兼容性不太好,這里我們寫介紹下比較早的方案 application cache 。

  service worker

  Service Worker是基于Web Worker的事件驅(qū)動的,他們執(zhí)行的機制都是新開一個線程去處理一些額外的,以前不能直接處理的任務(wù)。對于Web Worker,我們可以使用它來進行復(fù)雜的計算,因為它并不阻塞瀏覽器主線程的渲染。而Service Worker,我們可以用它來進行本地緩存,相當(dāng)于一個本地的proxy。說起緩存,我們會想起我們常用的一些緩存技術(shù)來緩存我們的靜態(tài)資源,但是老的方式是不支持調(diào)試的,靈活性不高。使用Service Worker來進行緩存,我們可以用javascript代碼來攔截瀏覽器的http請求,并設(shè)置緩存的文件,直接返回,不經(jīng)過web服務(wù)器,然后,做更多你想做的事情。

  因此,我們可以開發(fā)基于瀏覽器的離線應(yīng)用。這使得我們的web應(yīng)用減少對網(wǎng)絡(luò)的依賴。例如,我們開發(fā)了一個新聞閱讀的web應(yīng)用,當(dāng)你用手機瀏覽器在有網(wǎng)絡(luò)的情況下打開時,你可以正常的獲取新聞內(nèi)容??墒牵绻謾C進入飛行模式,那這個應(yīng)用你就沒法使用了。

  如果我們使用了Service Worker做緩存,瀏覽器http請求會先經(jīng)過Service Worker,通過url mapping去匹配,如果匹配到了,則使用緩存數(shù)據(jù),如果匹配失敗,則繼續(xù)執(zhí)行你指定的動作。一般情況下,匹配失敗則讓頁面顯示網(wǎng)頁無法打開。

  service work 生命周期

HTML5離線存儲詳

service work demo

<!DOCTYPE html>

<html>

  <head>

    <meta charset="utf-8">

    <script>

        navigator.serviceWorker.register("/service-worker.js").then(function(serviceWorker) {

            console.log("success!");

        });

    </script>

  </head>

  <body>

  </body>

</html>  

  在頁面注冊service-worker成功時就會調(diào)用這個js

  this.oninstall = function(e) {

  var resources = new Cache();

  var visited = new Cache();

  // Fetch them.

  e.waitUntil(resources.add(

  "/index.html",

  "/fallback.html",

  "/css/base.css",

  "/js/app.js",

  "/img/logo.png"

  ).then(function() {

  // Add caches to the global caches.

  return Promise.all([

  caches.set("v1", resources),

  caches.set("visited", visited)

  ]);

  }));

  };

  this.onfetch = function(e) {

  e.respondWith(

  // Check to see if request is found in cache

  caches.match(e.request).catch(function() {

  // It's not? Prime the cache and return the response.

  return caches.get("visited").then(function(visited) {

  return fetch(e.request).then(function(response) {

  visited.put(e.request, response);

  // Don't bother waiting, respond already.

  return response;

  });

  });

  }).catch(function() {

  // Connection is down? Simply fallback to a pre-cached page.

  return caches.match("/fallback.html");

  });

  );

  };

  service worker 采用事件監(jiān)聽機制, 上面的代碼監(jiān)聽了 install 和 fetch 事件,當(dāng) server worker 安裝成功后,調(diào)用此方法,然后緩存頁面的資源文件, fetch 頁面請求事件, server worker攔截到用戶請求,當(dāng)發(fā)現(xiàn)請求文件命中緩存則從緩存中取得文件,返回給頁面,無需經(jīng)過服務(wù)器,借此達到離線的目的。

  當(dāng)然 service worker 的功能遠不止現(xiàn)在這些

  indexedDB

  indexedDB 是一個用于本地存儲數(shù)據(jù)的 nosql 數(shù)據(jù)庫,擁有極快的數(shù)據(jù)查詢速度,而且可以直接保存js 對象。相比web sql(sqlite)更加高效,包括索引、事務(wù)處理和健壯的查詢功能。indexedDB特點:

  1.一個網(wǎng)站可能有一個或多個 IndexedDB 數(shù)據(jù)庫,每個數(shù)據(jù)庫必須具有惟一的名稱。

  2.一個數(shù)據(jù)庫可包含一個或多個對象存儲

  一個對象存儲(由一個名稱惟一標(biāo)識)是一個記錄集合。每個記錄有一個鍵 和一個值。該值是一個對象,可擁有一個或多個屬性。鍵可能基于某個鍵生成器,從一個鍵路徑衍生出來,或者是顯式設(shè)置。一個鍵生成器自動生成惟一的連續(xù)正整數(shù)。鍵路徑定義了鍵值的路徑。它可以是單個 JavaScript 標(biāo)識符或多個由句點分隔的標(biāo)識符。

  基本使用方式如下:

  var openRequest = indexedDB.open("auto_people", 3);var db; //數(shù)據(jù)庫對象

  openRequest.onupgradeneeded = function(e){

  console.log("Running onupgradeeded..."); var thisDB = e.target.result; if(!thisDB.objectStoreNames.contains("people")){ thisDB.createObjectStore("people", {autoIncrement:true}); //新建一個store并設(shè)置主鍵自增長 }

  }//創(chuàng)建成功

  openRequest.onsuccess = function(e){

  console.log("success!");

  db = e.target.result; //Listen for add clicks

  }

  openRequest.onerror = function(e){ console.log("error!"); console.dir(e);

  }//這應(yīng)該站在別的地方處理,這是做一個代碼展示var transaction = db.transaction(['people'], "readwrite"); //創(chuàng)建一個連接var store = transaction.objectStore("people"); //獲取storevar request = store.add({

  name: 'myron',

  email: 'test@qq.com',

  created: new Date()

  }); //添加信息

  request.onerror = function(e){

  alert('error!');

  console.dir(e);

  } //當(dāng)添加失敗時調(diào)用

  request.onsuccess = function(e){

  console.log('Did it!');

  } //添加成功時調(diào)用

  request = store.get(1); //獲取第一條數(shù)據(jù)

  request.onsuccess = function(e){

  var result = e.target.result;

  console.dir(result);

  if(result){

  //拿到存儲的對象 }

  }

  application cache

 

文章來源:HTML5中國

您還未登錄,請先登錄

熱門帖子

最新帖子

?