使用 HTML5 Web 存储实现离线工做:

使用 Web 存储添加离线功能javascript

HTML5 是一个新的 HTML 标准,它拥有大量新的功能和布局技术。它彻底支持多媒体、CSS3 以及使用画布和可缩放矢量图形 (Scalable Vector Graphics, SVG) 的绘图功能。HTML5 提供了新的语义元素,还提供了恰当的使用应用程序缓存器、JavaScript worker、新版本的             XMLHttpRequest 和一种名为 Web 存储的工具建立 HTML Web 应用程序的方式。本文将探讨 Web 存储的强大功能,以及它成为一种优于 cookies 的存储方法的缘由。经过本文您将了解基本概念、浏览器支持和 HTML5 Web 存储对象。php

 

概述

Cookies 从 JavaScript 出现之初就一直存在,因此在 Web 上存储数据并非个新概念。不过Web 存储是数据存储的一种更为强大的版本,可提供更多的安全性、速度和易用性。在 Web 存储中还能够存储数量巨大的数据。具体的数量则取决于 Web 浏览器,但一般都在 5MB 到10MB 之间,这对于一个 HTML 应用程序而言已经足够大。另外一个好处是此数据并不会在每次出现服务器请求时都被加载。唯一的限制是不能在浏览器之间分享 Web 存储, 若是您在 Safari 中存储了数据,那么该数据在 Mozilla Firefox 中是没法访问的。css

内置到 HTML5 中的 Web 存储对象有两种类型:html

  • sessionStorage 对象负责存储一个会话的数据。若是用户关闭了页面或浏览器,则会销毁数据。
  • The localStorage 对象负责存储没有到期的数据。当 Web 页面或浏览器关闭时,仍会保持数据的存储,固然这还取决于为此用户的浏览器设置的存储量。

经常使用的缩写语

  • API:应用程序编程接口 (Application Programming Interface)
  • CSS:级联样式表 (Cascading Style Sheet)
  • HTML:超文本标记语言 (HyperText Markup Language)
  • JSON:JavaScript Serialized Object Notation

这两种存储对象具备相同的方法和属性。为了得到一致性,本文在全部的示例中使用的都是 localStorage 对象。java

在本文中,咱们将了解  Web 存储的强大功能,以及它成为优于 cookies 的一种存储方式的缘由。本文还将探索基本的 Web 存储概念、HTML5 Web 存储方法和浏览器支持。jquery

 

 

浏览器支持

所 有最新的浏览器版本均支持 Web 存储特性,这些浏览器包括 Firefox、Google Chrome、Safari、Opera 和 Microsoft® Windows® Internet Explorer® 8+。不幸地是,Internet Explorer 7 和更早版本不支持 Web 存储。表 1 显示了支持 HTML5 Web 存储的每一个桌面浏览器版本。web

表 1. HTML5 Web 存储的桌面浏览器支持
Chrome Firefox Safari Opera Internet Explorer
Chrome Firefox Safari Opera Internet Explorer
4+ 4+ 4+ 11+ 8+

除了 Opera Mini 以外,其余移动浏览器也提供了对 HTML5 Web 存储的支持。表 2 显示了支持 HTML5 Web 存储的每一个移动浏览器版本。ajax

表 2. HTML5 Web 存储的移动浏览器支持
iOS Android Opera Mini Opera Mobile
iOS Android Opera Mini Opera Mobile
5+ 3+ NA 11+

HTML5 Web 存储的浏览器支持十分使人瞩目。可是,较老的浏览器要求在使用以前检查 Web 存储支持的浏览器。为了了解 Web 存储支持而对浏览器进行检查很是简单。可使用一个简单的条件语句来查看 HTML5 存储对象是否已经定义。若是已经定义,就能够放心进行 Web 存储脚本编写。若是未定义,而数据存储又是必需的,则须要采用一种备选方法,好比 JavaScript cookie。清单 1 的例子显示了一种简单的为 Storage 对象进行浏览器检查的方式。数据库

清单 1.  Web 存储支持的浏览器检查
if(typeof(Storage)!== "undefined") {
  // Web storage is supported
}
else {
  // Web storage is NOT supported
}

若是浏览器不支持 Web 存储,那么您可使用 JavaScript cookie 或一个现有的库(好比 AmplifyJS)来建立一个定制的 Web 存储对象。AmplifyJS 是一组组件,旨在经过一个简单的 API 解决常见 Web 应用程序问题,包括某些浏览器中的 Web 存储支持。AmplifyJS 用 amplify.store 包装程序来处理持久的客户端存储,它支持 Internet Explorer 5+、Firefox 2+、Safari 4+、Chrome、Opera 10.5+、iOS 2+ 和 Android 2+。这个库还支持一个持久的 API 来处理跨浏览器存储;您无需基于具体的浏览器编写不一样的代码。若是浏览器支持 HTML5 Web 存储,那么 AmplifyJS 就会使用最新的存储技术。若是浏览器不支持 HTML5 Web 存储,那么 AmplifyJS 就会降级,以支持没有该功能的存储。更多地了解 AmplifyJS 以及用于其存储包装程序的 API。编程

 

入门

有几种简单易用的方法可提供 HTML5 Web 存储功能。这些方法支持设置一个键/值对,提供了两个基于键来检索某个值的选项,同时清除全部的键/值对,并删除了某个特定的键/值对。表 3 显示了可用的 HTML5 Web 存储方法。

表 3. HTML5 Web 存储方法
方法 描述
setItem(key, value) 为 Web 存储对象添加一个键/值对,供之后使用。该值能够是任何的数据类型:字符串、数值、数组等。
getItem(key) 基于起初用来存储它的这个键检索值。
clear() 今后 Web 存储对象清除全部的键/值对。
removeItem(key) 基于某个键今后 Web 存储对象清除特定的键/值对。
key(n) 检索 key[n] 的值。

在建立并将键/值对添加到此 Web 存储对象时,可使用任何类型做为键/值对中的值(字符串、数值、数组、对象等)。要存储一个数组或对象,则必须使用 JSON 对象经过 JSON.stringify 方法将数据转换为一个字符串。在检索此数据时,可使用 JSON.parse 进行检索,它会返回原始状态的对象或数据。还有两种向 Web 存储对象添加键/值对的不一样方式。第一种方式是使用 setItem 方法,如清单 2 所示。

清单 2. 使用 setItem 方法向 Web 存储对象添加键/值对
localStorage.setItem('myKey', 'myValue');

向 Web 存储对象添加键/值对的第二种方法是使用带 dot 参数的 Web 存储对象来直接设置此键的值,如清单 3 所示。

清单 3. 直接向 Web 存储对象添加键/值对
localStorage.myKey = 'myValue';

检索所存储的值一样十分简单,也有两种方式。第一种方式是使用 getItem 方法,它接受键做为参数并返回相应的值(若是存在)。清单 4 显示了一个示例。

清单 4. 使用 getItem 从 Web 存储对象中检索键/值对
localStorage.getItem('myKey');

从 Web 存储对象中检索键/值对的第二个方法是使用 dot 参数直接访问它,如清单 5 所示。该示例返回了在以前的例子中设置的 'myValue' 字符串值。

清单 5. 直接从 Web 存储对象中检索键/值对
localStorage.myKey;

有两种方法能够删除所存储的数据。能够同时删除全部项,也能够一次删除个别项。要同时从 Web 存储对象中删除全部项,可使用 clear 方法,如清单 6 所示。

清单 6. 从 Web 存储对象中删除全部键/值对
localStorage.clear();

要从 Web 存储对象中删除单个键/值对,须要使用 removeItem 方法。清单 7 显示了 removeItem 方法的一个示例,它接受一个键做为参数,并肯定哪一个键/值对要今后存储对象删除。

清单 7. 从 Web 存储对象中删除单个键/值对
localStorage.removeItem('myKey');

清单 8 显示了一个如何使用 JSON 对象经过 JSON.stringify 方法将一个数组存储为字符串的示例。能够采用相同的方法处理对象。

清单 8. 在 HTML5 Web 存储中将一个数组存储为字符串
var myArray = new Array('First Name', 'Last Name', 'Email Address');
localStorage.formData = JSON.stringify(myArray);

要从 Web 存储检索数组的字符串版本,并将它转换回一个可用的 JavaScript 数组,只需使用 JSON.parse 方法,如清单 9 所示。

清单 9. 从 HTML5 Web 存储中检索数组的字符串版本并将它转换成一个可用的 JavaScript 数组
var myArray = JSON.parse(localStorage.formData);

Internet Explorer 8+、Opera 10.5+、Firefox 3.5+、Safari 4+ 和 Chrome 均包括了一个本地的 JSON 对象,可使用该对象来支持以前例子中的那些代码。若是您使用的是版本较早的浏览器,那么能够下载 json2.js 文件

到目前为止,Web 存储看起来很容易使用。可是,在开始使用以前,您应该意识到在共享的机器上会存在安全性问题。Web 存储并不比 cookies 安全。因此不要在客户端存储敏感信息,好比密码或信用卡信息。

 

工做中的 Web 存储

介绍完基础知识后,如今是时候将 HTML5 Web 存储付诸于使用了。假设在您的网站上,您想要为一个 Web 表单提供离线支持。若是用户提交了表单,而且在网站恢复在线时让此表单与服务器同步,那岂不是很不错。HTML5 能够实现此目标。

建立一个简单的 Web 表单,其中包含姓名、电子邮件地址和提交按钮,如清单 10 所示。

清单 10. 使用 HTML5 Web 存储来存储数据的一个简单 Web 表单
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>HTML5 Web Storage</title>
<style type="text/css">
label, 
input {
  display: block;
}
input {
  margin-bottom: 10px;
}
</style>
</head>

<body>

<form action="post.php" method="post" id="web-storage-form">
  <label for="first-name">First name:</label>
  <input type="text" name="first-name" id="first-name">

  <label for="last-name">Last name:</label>
  <input type="text" name="last-name" id="last-name">

  <label for="email-address">Email Address:</label>
  <input type="text" name="email-address" id="email-address">

  <input type="submit" value="Submit">
</form>

</body>
</html>

此表单包含了一个 ID,可以使用 JavaScript 检索表单 post 和值。此外,它还提供了 CSS,以建立具备表单元素的基本布局。标签和输入上的 display:block 将每一个元素置于一个新行。margin-bottom 属性在条目之间建立空间,让页面看起来不会太乱。

当用户提交表单时,代码首先会检索 web-storage-form ID 并使用 jQuery 捕获默认张贴,以阻止此张贴操做的发生。当张贴表单时,就能够收集表单值以及此表单动做的 URL,以便将它们存储在变量中。在做为 Asynchronous JavaScript + XML (Ajax) post 发送表单值,或将它们存储于 Web 存储中时,您还须要序列化这些 Web 表单值。在提交表单以前,应该使用 navigator.onLine 属性查看用户当前是否在线。

若是用户在线,则使用 jQuery.post 函数,这是一个简略的 Ajax 函数,用于发送数据并从服务器接收数据。这个函数接受四个参数:数据被发送到的 url、正在发送的 data(序列化后的表单值)、请求成功便会触发的 callback 函数以及 dataType。在本例中,并未包括 dataType,因此会使用默认参数。

若是用户不在线,那么就可让 Web 存储一展身手了。首先也是很重要的一点是,使用 清单 1 中建立的条件语句来查看浏览器是否支持 Web 存储。若是浏览器不支持 Web 存储,则使用一个定制键将表单值直接存储到 localStorage 对象中。本例使用了 formValues 定制键。localStorage 值的已经保存,如今能够检查当用户恢复在线时这些值是否存在,作法是经过添加一个 if 语句来检查 localStorage.formValues 是否有一个值。若是有一个值,则代表这个表单以前已经提交到 localStorage,并可使用先前设置好的 jQuery.post 方法安全地向服务器发送数据。在提交值以后,应该从 Web 存储中将它们删除,以防止意外地重复提交它们。清单 11 显示了从使用 Ajax 的表单张贴到 localStorage 期间所需代码。

清单 11. 离线时将表单数据存储于 localStorage,在线时将其提交到服务器
<script type="text/javascript" 
src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js">
</script>
<script type="text/javascript">
$(document).ready(function() {
  // Check for web storage values from a previous offline session
  if(localStorage.formValues) {
    console.log("localStorage.formValues: "+ localStorage.formValues);
    postForm($("#web-storage-form").attr('action'), localStorage.formValues);
    localStorage.removeItem("formValues");
  }

  $("#web-storage-form").submit(function(event) {
    // Prevent the form from posting
    event.preventDefault(); 

    // Gather values
    var formValues = $(this).serialize();
    var url = $(this).attr('action');
    postForm(url, formValues);
  });
 });

function postForm(url, formValues) {
  // Post to server or post to web storage
  if(navigator.onLine) {
    console.log("Online");
    $.post(url, formValues, function(data) {
      console.log("Success: "+ data);
    });
  }
  else {
    console.log("Offline");
    if(typeof(Storage) !== "undefined") {
      console.log("Storage supported");
      localStorage.formValues = formValues;
    }
  }
}
</script>

为了建立一个完整的例子,使用 post.php 文件充当表单张贴的结尾,用以接收和响应表单请求。这个文件只简单接收表单张贴并经过打印键/值对进行响应,如清单 12 所示。当 jQuery.post 收到响应后,就能够未来自响应的数据写入控制台了。

清单 12. 可响应表单请求的 PHP 文件
<?php print_r($_POST); ?>

固然,您还可让这个例子更为健壮。好比,您能够在服务器端上提供数据库存储,并使用一个间隔来检查 localStorage,以便随时监视用户的计算机是否恢复在线,从而提交表单数据。

 

结束语

HTML5 提供了一组强大的新功能,并迅速得到了主要 Web 浏览器的最新版本的支持。Web 存储是 HTML5 众多引人注目的特性中的一个。可是,务必巧妙使用它。对于 cookie,用户能够关闭 Web 存储。始终都要有一个备案,以便支持那些不想使用此新功能的用户。

相关文章
相关标签/搜索