离线应用与客户端存储学习笔记

所谓的离线web应用,就是在设备上不能上网的情况下仍然可以运行的应用。

 开发离线web 应用的几个步骤:

1.首先是确保应用知道设备是否能上网

2.然后应用还必须能访问一定的资源

3.最后必须有一块本地的储存空间用于保存数据

 

离线检测 navigator.onLine

HTML5 定义了一个navigator.onLine属性。这个属性值为true表示设备可以上网,值为false表示设备离线。

 
  1. if(navigator.onLine) {

  2. //正常工作

  3. } else {

  4. //执行离线状态时的任务

  5. }

除了navigator.onLine属性之外,HTML5还定义了两 个事件:online和offline。当网络从离线变为在线或者从在线 变为离线时,分别触发这 两个事件。

 
  1. EventUtil.addHandler(window,"online",function(){

  2. alert("Online");

  3. });

  4. EventUtil.addHandler(window,"offline",function(){

  5. alert("Offline");

  6. })

应用缓存

HTML5的应用缓存,或者简称为appcache,是专门为开发离线Web应用而设计的。

要想在这个缓存中保存数据,可以使用一个描述文件(manifest file),列出要下载和缓存的资源。

 
  1. CACHE MANIFET

  2. #Comment

  3.  
  4. file.js

  5. file.css

要将描述的文件与页面关联起来,可以在<html>中的manifest属性中指定这个文件的路径,例如:

<html manifest="/offline.manifest">

这个API的核心是applicationCache对象,这个对象有一个status属性,属性值是常量:

0:无缓存

1: 闲置

2:检查中

3:下载中

4:更新完成。所有 资源下载完成后,可以通过swapCache()来使用了。

5:废弃

应用缓存还有很多相关的事件,表示其状态的改变:

checking:在浏览器为应用缓存查找更新时触发

error:在检查更新或下载资源期间发生错误时触发

noupdata:在检查描述文件发现文件无变化时触发

downloading:在开始下载应用缓存资源时触发

progress:在文件下载应用缓存的 过程中持续不断地触发

updateready:在页面新的应用缓存 下载完毕且可以通过swapCache()使用时触发

cached:在应用缓存完整可用时触发

applicationCache.updata();

updata()一经调用,应用缓存就会去检查描述文件是否更新。然后就像页面刚刚加载一样,继续执行后续操作。如果触发了cached事件,就说明应用缓存已经准备就绪,不会再发生其他操作。如果触发了updateready事件,则说明新版本的应用缓存已经可用,而此时要调用swapCache()来启用新应用缓存。

 
  1. EventUtil.addHandler(applicationCache,"updateready",function(){

  2. applicationCache.swapCache();

  3. })

 

数据存储

Cookie

IE用户数据

Web存储机制

IndexedDB

Cookie

HTTP Cookie,通常叫做Cookie,最初是在客户端用于存储会话信息的。该标准要求服务器时任意HTTP请求发送Set-Cookie HTTP头作为响应的一部分,其中包含会话信息。例如:

 
  1. HTTP/1.1 200 OK

  2. Content-type: text/html

  3. Set-Cookie: name=value

  4. Other-header: other-header-value

浏览器会存储这样的会话信息。并在这之后,通过为每个请求添加Cookie HTTP头部信息发送回服务器,例如:

 
  1. GET /index.html HTTP/1.1

  2. Cookie: name=value

  3. Other-header: other-header-value

限制

IE6及更多版本最多20个cookie

IE7之后的版本每个域名最多50个cookie

Firefox限制每个域最多50个cookie

Opera限制每个域最多30个cookie

Safar和Chrome没有硬性规定

 

cookie组成

名称:一个惟一确定名称

值:储存在cookie中的字符串值

域:cookie对于哪个域是有效的

路径:对于指定域中的哪个 路径,应用向服务器发送cookied

失效时间:表示cookie何时应用被删除的时间戳

安全标志:指定后,cookie只有在使用SSL连接的时候才会发送到服务器。

 

Javascript中的cookie

所有名字和值都是经过URL编码的,所以必须使用decodeURIComponent()

当用于设置值的时候,document.cookie属性可以设置为一个新的cookie字符串。

document.cookie = "name=Nicholas";

下面例子使用encodeURI-Component()

document.cookkie = encodeURIComponent("name") + "=" + encodeURIComponent("Nicholas");

要给被创建的cookie指定额外的信息,可以如下:

document.cookkie = encodeURIComponent("name") + "=" + encodeURIComponent("Nicholas") + ";domain=.wrox.com;path=/";

基本的cookie操作有三种:读取,写入和删除。如下:

 
  1. var CookieUtil = {

  2. get: function(name) {

  3. var cookieName = encodeURIComponent(name) + "=",

  4. cookieStart = document.cookie.indexOf(cookieName),

  5. cookieValue = null;

  6. if(cookieStart > -1) {

  7. var cookieEnd = document.cookie.indexOf(";",cookieStart);

  8. if(cookieEnd == -1){

  9. cookieEnd = document.cookie.length;

  10. }

  11. cookieValue = decodeURIComponent(document.cookie.substring(cookieStart + cookieName.length,cookieEnd));

  12. }

  13. return cookieValue;

  14.  
  15. },

  16.  
  17. set: function(name, value, expires, path, domain, secure){

  18. var cookieText = encodeURIComponent(name) + "=" +encodeURIComponent(value);

  19. if(expires instanceof Date){

  20. cookieText += "; expires=" + expires.toGMTString();

  21. }

  22. if(path){

  23. cookieText += "; path=" + path;

  24. }

  25. if(domain){

  26. cookieText += "; domain=" + domain;

  27. }

  28. if(secure){

  29. cookieText += "; secure";

  30. }

  31. document.cookie = cookieText;

  32. },

  33. unset: function(name, path, domain, secure){

  34. this.set(name, "", new Date(0), path, domain, secure);

  35. }

  36. }

 

 
  1. //设置cookie

  2. CookieUtil.set("name", "Nicholas");

  3. CookieUtil.set("book", "Professional JavaScript");

  4.  
  5. //读取cookie

  6. alert(CookieUtil.get(name)); //"Nicholas"

  7. alert(CookieUtil.get(book)); //"Professional JavaScript"

  8.  
  9. //删除cookie

  10. CookieUtil.unset("name");

  11. CookieUtil.unset("book");

  12.  
  13. //设置cookie 包括它的路径,域,失效日期

  14. CookieUtil.set("name", "Nicholas","/book/projs","www.wrox.com", new Date("January 1, 2011"));

  15. //删除刚刚设置的cookie

  16. CookieUtil.unset("name", "/book/projs", "www.wrox.com")

  17. //设置安全的cookie

  18. CookieUtil.set("name","Nicholas",null,null,null,true);

 

子cookie

为了绕开浏览器的单域名下的cookie限制数,可以使用一种称为子cookie的概念。它的格式如下 :

name=name1=value&name2=value2&name3=value3&name4=value4&name5=value5

获取子cookie方法有两种:get()和getAll()

设置子cookie方法有两种:set()和setAll()

删除子cookie方法有两种:unset(),unsetAll()

 

IE用户数据

微软通过一个自定义行为引入了持久化用户数据的概念。用户数据允许每个文档最多128KB数据,每个域名最多1MB数据。首先使用CSS在某个元素上指定userData行为:

 
  1. <div style="behavior:url(#default#userData)" id="dataStore"></div>

  2.  
  3.  
  4. <script type="text/javascript">

  5. var dataStore = document.getElementById("dataStore");

  6. dataStore.setAttribute("name", "Nichilas");

  7. dataStore.setAttribute("book", "Professional JavaScript");

  8. dataStore.save("BookInfo"); //保存到数据空间BookInfo

  9.  
  10. dataStore.load("BookInfo"); //获取数据

  11. console.log(dataStore.getAttribute("name"));

  12. console.log(dataStore.getAttribute("book"));

  13.  
  14. //可以使用removeAttribute()方法明确指定要删除的数据

  15. dataStore.removeAttribute("name");

  16. dataStore.removeAttribute("book");

  17. dataStore.save("BookInfo");

  18. </script>

Web存储机制

Web Storage的两个主要目的是:

1.提供一种在cookie之外的存储会话数据的途径

2.提供一种存储大量可以跨 会话存在的数据的机制

两种对象定义:sessionStorage和globalStorage

Storage类型

Storage类型提供最大的存储空间来存储名值对,Storage的实例与其他对象类似,有以下方法:

clear():删除所有值。

getItem:根据指定的名字name获取对应的值

key(index):获得index位置处的值的名字

removeItem(name):删除由name指定的名值对

setItem(name,value):为指定的name设置一个对应的值

sessionStorage对象

该对象存储特定于某个会话的数据,会cookie,在浏览器关闭后消失。

 
  1. //使用方法存储数据

  2. sessionStorage.setItem("name", "Nicholas");

  3. //使用属性存储数据

  4. sessionStorage.book = "Profesional Javascript";

  5. //使用方法来读取数据

  6. sessionStorage.getItem("name");

  7. //使用属性存储数据

  8. var book = sessionStorage.book;

还可以通过结束length属性和key()方法来迭代sessionStoragel中的值:

 
  1. for (var i = 0, len = sessionStorage.length; i < len; i++) {

  2. var key = sessionStorage.key(i);

  3. var value = sessionStorage.getItem(key);

  4. console.log(key + "=" + value);

  5. }

 

globalStore对象

这个对象的目的是跨越会话存储数据。

 
  1. //保存数据

  2. globalStorage = ["wrox.com"].name = "Nichloas";

  3. //获取数据

  4. var name = globalStorage["wrox.com"].name;

  5.  
  6. //保存数据

  7. globalStorage["www.wrex.com"].name = "Nichloas";

  8. //获取数据

  9. var name = globalStorage["www.wrex.com"].name;

localStorage对象

该对象可以持久保存客户端数据的方案取代了globalStorage。

 
  1. //使用方法保存数据

  2. localStorage.setItem("name", "Nicholas");

  3. //使用属性保存数据

  4. localStorage.book = "Professinal Javascript";

  5.  
  6. //使用方法读取数据

  7. var name = localStorage.getItem("name");

  8. //使用属性读取数据

  9. var book = localStorage.book;

storage事件

对Storage对象进行任何修改,都会在文档上触发storage事件。

domain:发生变化的存储空间的域名

key:设置或者删除的键名

newValue:如果是设置值,则是新值,如果是删键,则是null

oldValue:键被更改之前的值

以下代码展示了如何侦听storage事件

 
  1. EventUtil.addHandler(document,"storage",function(event){

  2. alert("Storage changed for " + event.domain);

  3. })

限制

localStorage:桌面浏览器会设置每个来源5MB,浏览 器2.5MB

sessionStorage:因浏览器而异,IE和Opera5MB,其他是2.5MB

 

IndexedDB

Indexed Database API,简称为IndexedDB,是在浏览器中保存数据的一种数据库。

var indexedDB = window.indexedDB || window.msIndexedDB || window.mozIndexDB || window.webkitIndexedDB ;

数据库

使用Index的第一步是打开它,即要把数据库名称传给indexedDB.open()。调用indexedDB.open()会返回一个IDBRequest对象,这个对象上可以添加onerror和onsuccess事件处理即可,如下示例:

 
  1. var request,database;

  2. request = indexedDB.open("admin");

  3. request.onerror = function(event){

  4. alert("Something bad happened while trying to open:" + event.target.errorCode);

  5. }

  6. request.onsuccess = function(event){

  7. database = event.target.result;

  8. }

对象存储空间

在建立 数据库后,下一步是使用对象存储空间。

假设要保存用户记录由用户名,密码等组成,可如下:

 
  1. var user = {

  2. username: "007",

  3. firstName: "James",

  4. lastName: "Bond",

  5. password: "foo"

  6. }

以下是为保存上述用户记录而创建对象存储空间的示例:

var store = db.createObjectStore("users",{keyPath: "username"});

有了存储空间的引用,接下来可以使用add()或put()方法来向其中添加数据。

 
  1. //users 中保存着一批用户对象

  2. var i = 0,

  3. len = users.length;

  4. while(i<len){

  5. store.add(users[i++]);

  6. }

如果想验证请求是否成功完成,可以把返回的请求对象保存一个变量中,然后再指定onerror或onsuccess事件处理程序

 
  1. //users 中保存着一批用户对象

  2. var i = 0,

  3. request,

  4. len = users.length;

  5.  
  6. while(i<len){

  7. request = store.add(users(i++));

  8. request.onerror = function(){

  9. //处理程序

  10. };

  11. request.onsuccess = function(){

  12. //处理成功

  13. };

  14. request.push(request);

  15.  
  16. }

创建了对象存储空间并向其中添加数据之后,就可以查询数据了

事务

在数据库对象上调用transactioon()方法可以创建事务。

var transaction = db.transaction();
var transaction = db.transaction("users",IDBTransaction.READ_WRITE);

取得了事务的索引后,使用objectStore()方法并传入存储空间,就可以访问特定的存储空间。

add(),put(),get(),delete(),clear()

 
  1. var request = db.transaction(users).objectStore("users").get("007");

  2. request.onerror = function(event){

  3. alert("Did not get the object");

  4. }

  5. request.onsuccess = function(event){

  6. var result = event.target.result;

  7. alert(result.firstName);

  8.  

--------------------- 本文来自 JinmyHe 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/weixin_42659625/article/details/82826443?utm_source=copy

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值