使用HTML5开发离线应用 - cache manifest(4)

回页首

在线状态检测

如果 Web 应用程序仅仅是一些静态页面的组合,那么通过 cache manifest
缓存资源文件以后,就可以支持离线访问了。但是随着互联网的发展,特别是 Web2.0 概念流行以来,用户的提交的数据渐渐成为互联网的主流。那么在开发支持离线的
Web
应用时,就不能仅仅满足于静态页面的展现,还必需考虑如何让用户在离线状态下也可以操作数据。离线状态时,把数据存储在本地;在线以后,再把数据同步到服务器上。为了做到这一点,开发者首先必须知道浏览器是否在线。HTML5
提供了两种检测是否在线的方式:navigator.online 和 online/offline 事件。

    1. navigator.onLine

      navigator.onLine 属性表示当前是否在线。如果为 true, 表示在线;如果为 false,
      表示离线。当网络状态发生变化时,navigator.onLine 的值也随之变化。开发者可以通过读取它的值获取网络状态。

  1. online/offline 事件

    当开发离线应用时,通过 navigator.onLine 获取网络状态通常是不够的。开发者还需要在网络状态发生变化时立刻得到通知,因此 HTML5
    还提供了 online/offline 事件。当在线 / 离线状态切换时,online/offline 事件将触发在 body 元素上,并且沿着
    document.body、document 和 window 的顺序冒泡。因此,开发者可以通过监听它们的 online/offline
    事件来获悉网络状态。


回页首

DOM Storage

在开发支持离线功能的 Web 应用时,开发者需要在本地存储数据。当前浏览器支持的 cookie 虽然也可以用来存储数据,但是 cookie
长度非常小(通常几 k),而且功能有限。因此,HTML5 中新引入了 DOM Storage 机制,用于存储 key/value
对,它的设计目标是提供大规模、安全且易用的存储功能。

DOM Storage 分类

DOM Storage 分为两类:sessionStorage 和 localStorage。除了以下区别外,这两类存储对象的功能是完全一致的。

    1. sessionStorage 用于存储与当前浏览器窗口关联的数据。窗口关闭后,sessionStorage 中存储的数据将无法使用。
  1. localStorage 用于长期存储数据。窗口关闭后,localStorage 中的数据仍然可以被访问。所有浏览器窗口可以共享
    localStorage 的数据。

DOM Storage 接口

每一个 Storage 对象都可以存储一系列 key/value 对,Storage 接口定义为:

 interface Storage {
  readonly attribute unsigned long length;
  getter DOMString key(in unsigned long index);
  getter any getItem(in DOMString key);
  setter creator void setItem(in DOMString key, in any data);
  deleter void removeItem(in DOMString key);
  void clear();
 };

其中最常用的接口是 getItem 和 setItem。getItem 用于获取指定 key 的 value,而 setItem 用于设置指定 key 的
value。

DOM Storage 示例

这里给出一个使用了 sessionStorage 的例子,localStorage 的用法与它相同。首先使用 SetItem
添加了一个名为“userName”的项,它的值是“developerworks”。然后,调用 getItem
得到“userName”的值,并且弹出提示框显示它。最后,调用 removeItem 删除“userName”。

清单 6 DOM Storage 示例代码

 <!DOCTYPE HTML>
 <html>
 <body>
 <script>
 // 在 sessionStorage 中定义‘userName‘变量
 sessionStorage.setItem(‘userName‘, ‘developerworks‘);
 // 访问‘userName‘变量
 alert("Your user is: " + sessionStorage.getItem(‘userName‘));
 // 最后删除‘userName‘
 sessionStorage.removeItem(‘userName‘);
 </script>
 </body>
 </html>

回页首

Web SQL Database

除了 DOM Storage 以外,HTML5 中还有另外一种数据存储方式 Web SQL
Database。它提供了基本的关系数据库功能,支持页面上的复杂的、交互式的数据存储。它既可以用来存储用户产生的数据,也可以作为从服务器获取数据的本地高速缓存。例如可以把电子邮件、日程等数据存储到数据库中。Web
SQL Database 支持数据库事务的概念,从而保证了即使多个浏览器窗口操作同一数据,也不会产生冲突。

Web SQL Database 基本用法

  1. 创建和打开数据库

使用数据库的第一步是创建并打开数据库,API 是 openDatabase。当数据库已经存在时,openDatabase
仅仅打开数据库;如果这个数据库不存在,那么就创建一个空数据库并且打开它。openDatabase 的定义是:

  Database openDatabase(in DOMString name, in DOMString version,
  in DOMString displayName, in unsigned long estimatedSize,
  in optional DatabaseCallback creationCallback);

name:数据库名。

version:数据库版本。

displayName:显示名称。

estimatedSize:数据库预估长度(以字节为单位)。

creationCallback:回调函数。

    1. 执行事务处理

      在打开数据库以后,就可以使用事务 API
      transaction。每一个事务作为操作数据库的原子操作,不会被打断,从而避免了数据冲突。transaction 的定义是:

       void transaction(in SQLTransactionCallback callback,
       in optional SQLTransactionErrorCallback errorCallback,
       in optional SQLVoidCallback successCallback);
      

      callback:事务回调函数,其中可以执行 SQL 语句。

      errorCallback:出错回调函数。

      successCallback:执行成功回调函数。

  1. 执行 SQL 语句

    在事务的回调函数 callback 中,可以执行 SQL 语句,API 是 executeSQL。executeSQL 的定义是:

      void executeSql(in DOMString sqlStatement,
      in optional ObjectArray arguments, in optional SQLStatementCallback callback,
      in optional SQLStatementErrorCallback errorCallback);
    

    sqlStatement:SQL 语句。

    arguments:SQL 语句需要的参数。

    callback:回调函数。

    errorCallback:出错回调函数。

Web SQL Database 示例

下面通过一个例子说明 Web SQL Database 的基本用法。它首先调用 openDatabase 创建了名为“fooDB”的数据库。然后使用
transaction 执行两条 SQL 语句。第一条 SQL 语句创建了名为“foo”的表,第二条 SQL 语句向表中插入一条记录。

清单 7 Web SQL Database 示例代码

 var db = openDatabase(‘fooDB‘, ‘1.0‘, ‘fooDB‘, 2 * 1024);
 db.transaction(function (tx) {
  tx.executeSql(‘CREATE TABLE IF NOT EXISTS foo (id unique, text)‘);
  tx.executeSql(‘INSERT INTO foo (id, text) VALUES (1, "foobar")‘);
 });
时间: 2024-08-09 22:00:01

使用HTML5开发离线应用 - cache manifest(4)的相关文章

使用HTML5开发离线应用 - cache manifest(1)

HTML5 是目前正在讨论的新一代 HTML 标准,它代表了现在 Web 领域的最新发展方向.在 HTML5 标准中,加入了新的多样的内容描述标签,直接支持表单验证.视频音频标签.网页元素的拖拽.离线存储和工作线程等功能. 其中一个新特性就是对离线应用开发的支持. 在开发支持离线的 Web 应用程序时,开发者通常需要使用以下三个方面的功能: 离线资源缓存:需要一种方式来指明应用程序离线工作时所需的资源文件.这样,浏览器才能在在线状态时,把这些文件缓存到本地. 此后,当用户离线访问应用程序时,这些

使用HTML5开发离线应用 - cache manifest(5)

回页首 离线应用示例 最后,通过一个例子来说明使用 HTML5 开发离线应用的基本方法.这个例子会用到前面提到的离线资源缓存.在线状态检测和 DOM Storage 等功能.假设我们开发一个便签管理的 Web 应用程序,用户可以在其中添加和删除便签.它支持离线功能,允许用户在离线状态下添加.删除便签,并且当在线以后能够同步到服务器上. 应用程序页面 这个程序的界面很简单,如图 1 所示.用户点击“New Note”按钮可以在弹出框中创建新的便签,双击某便签就表示删除它. 图 1. 应用程序页面

使用HTML5开发离线应用 - cache manifest(2)

清单 1. Clock 应用代码 <!-- clock.html --> <!DOCTYPE HTML> <html> <head> <title>Clock</title> <script src="clock.js"></script> <link rel="stylesheet" href="clock.css"> </head

HTML5 开发离线应用

HTML5 离线功能介绍 HTML5 是目前正在讨论的新一代 HTML 标准,它代表了现在 Web 领域的最新发展方向.在 HTML5 标准中,加入了新的多样的内容描述标签,直接支持表单验证.视频音频标签.网页元素的拖拽.离线存储和工作线程等功能.其中一个新特性就是对离线应用开发的支持. 在开发支持离线的 Web 应用程序时,开发者通常需要使用以下三个方面的功能: 离线资源缓存:需要一种方式来指明应用程序离线工作时所需的资源文件.这样,浏览器才能在在线状态时,把这些文件缓存到本地.此后,当用户离

Html5开发总结

[Html5能够离线操作.能否开发Html5离线网络应用程序] 按常理Html5开发出来的是Web网页应用,则需网络连接才能下载并使用,作为Html5对离线应用开发的支持最大的特殊,支持离线需要满足如下条件: 离线资源缓存:需要一种方式来指明应用程序离线工作时所需的资源文件.这样,浏览器才能在在线状态时,把这些文件缓存到本地.此后,当用户离线访问应用程序时,这些资源文件会自动加载,从而让用户正常使用.HTML5 中,通过 cache manifest 文件指明需要缓存的资源,并支持自动和手动两种

html5离线储存,application cache,manifest使用体验

最近在APP里新增一个论坛模块,为了快速地完成,决定将整个论坛模块做成WEB APP,WEB APP最致命的就是用户体验问题,页面跳转和过多的请求,大大影响了加载速度和用户体验,这时候我想到了HTML5的离线储存. 经过简单的了解之后,觉得这个可以有,但很快我又就发现,HTML5离线储存并不适于这次的项目. 原因如下: 1. 一旦页面指定了manifest,那么这个页面就一定被储存下来.如果有一个动态页面,不想缓存页面的内容,只想缓存页面所引用的css,js,img,但抱歉,这个没有办法做到.我

转 html5离线储存,application cache,manifest使用体验

html5离线应用application cache 最近在APP里新增一个论坛模块,为了快速地完成,决定将整个论坛模块做成WEB APP,WEB APP最致命的就是用户体验问题,页面跳转和过多的请求,大大影响了加载速度和用户体验,这时候我想到了HTML5的离线储存. 经过简单的了解之后,觉得这个可以有,但很快我又就发现,HTML5离线储存并不适于这次的项目. 原因如下: 1.  一旦页面指定了manifest,那么这个页面就一定被储存下来.如果有一个动态页面,不想缓存页面的内容,只想缓存页面所

【转】html5离线储存,application cache,manifest使用体验

最近在APP里新增一个论坛模块,为了快速地完成,决定将整个论坛模块做成WEB APP,WEB APP最致命的就是用户体验问题,页面跳转和过多的请求,大大影响了加载速度和用户体验,这时候我想到了HTML5的离线储存. 经过简单的了解之后,觉得这个可以有,但很快我又就发现,HTML5离线储存并不适于这次的项目. 原因如下: 1. 一旦页面指定了manifest,那么这个页面就一定被储存下来.如果有一个动态页面,不想缓存页面的内容,只想缓存页面所引用的css,js,img,但抱歉,这个没有办法做到.我

使用 jQuery Mobile 与 HTML5 开发 Web App —— HTML5 离线缓存

本文要介绍的,是 HTML5 离线网络应用程序的特性,离线网络应用程序在 W3C 中的实际名称是 "Offline Web applications" ,也称离线缓存.当用户打开浏览器时,浏览器会将一个列表中指定的资源都下载并储存在本地.下次当用户再访问这个网络程序时,浏览器会自动引用本地缓存中相应的文件,而不会再从网络下载这些资源.不管离线网络应用程序是否专为 Web Apps 而设,但这对于 Web Apps 来说无疑是个非常实用的特性,它使到 Web Apps 相对于原生 App