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

回页首

离线应用示例

最后,通过一个例子来说明使用 HTML5 开发离线应用的基本方法。这个例子会用到前面提到的离线资源缓存、在线状态检测和 DOM Storage
等功能。假设我们开发一个便签管理的 Web
应用程序,用户可以在其中添加和删除便签。它支持离线功能,允许用户在离线状态下添加、删除便签,并且当在线以后能够同步到服务器上。

    1. 应用程序页面

      这个程序的界面很简单,如图 1 所示。用户点击“New Note”按钮可以在弹出框中创建新的便签,双击某便签就表示删除它。

      图 1. 应用程序页面

      这个页面的源文件是 index.html,它的代码如清单 8 所示。

      清单 8 页面
      HTML 代码

       <html manifest="notes.manifest">
       <head>
       <script type="text/javascript" src="server.js"></script>
       <script type="text/javascript" src="data.js"></script>
       <script type="text/javascript" src="UI.js"></script>
       <title>Note List</title>
       </head> 
      
       <body onload = "SyncWithServer()">
       <input type="button" value="New Note" onclick="newNote()">
       <ul id="list"></ul>
       </body>
       </html>
      

      在 body 中声明了一个按钮和一个无序列表。当按下“New Note”按钮时,newNote
      函数将被调用,它用来添加一条新的便签。而无序列表初始为空,它是用来显示便签的列表。

    1. cache manifest 文件

      定义 cache manifest
      文件,声明需要缓存的资源。在这个例子中,需要缓存“index.html”、“server.js”、“data.js”和“UI.js”等 4
      个文件。除了前面列出的“index.html”外,“server.js”、“data.js”和“UI.js”分别包含服务器相关、数据存储和用户界面代码。cache
      manifest 文件定义如下。

      清单 9 cache manifest
      文件

       CACHE MANIFEST
       index.html
       server.js
       data.js
       UI.js
      
    1. 用户界面代码

      用户界面代码定义在 UI.js 中。

      清单 10 用户界面代码
      UI.js

       function newNote()
       {
          var title = window.prompt("New Note:");
          if (title)
          {
              add(title);
          }
       } 
      
       function add(title)
       {
          // 在界面中添加
          addUIItem(title);
          // 在数据中添加
          addDataItem(title);
       } 
      
       function remove(title)
       {
          // 从界面中删除
          removeUIItem(title);
          // 从数据中删除
          removeDataItem(title);
       } 
      
       function addUIItem(title)
       {
          var item = document.createElement("li");
          item.setAttribute("ondblclick", "remove(‘"+title+"‘)");
          item.innerHTML=title; 
      
          var list = document.getElementById("list");
          list.appendChild(item);
       }  
      
       function removeUIItem(title)
       {
          var list = document.getElementById("list");
          for (var i = 0; i < list.children.length; i++) {
              if(list.children[i].innerHTML == title)
              {
                  list.removeChild(list.children[i]);
              }
          }
       }
      

      UI.js 中的代码包含添加便签和删除便签的界面操作。

    2. 添加便签
      1. 用户点击“New Note”按钮,newNote 函数被调用。
      1. newNote 函数会弹出对话框,用户输入新便签内容。newNote 调用 add 函数。
      1. add 函数分别调用 addUIItem 和 addDataItem 添加页面元素和数据。addDataItem 代码将在后面列出。
      1. addUIItem 函数在页面列表中添加一项。并指明 ondblclick 事件的处理函数是
        remove,使得双击操作可以删除便签。
      • 删除便签
      1. 用户双击某便签时,调用 remove 函数。
      1. remove 函数分别调用 removeUIItem 和 removeDataItem 删除页面元素和数据。removeDataItem
        将在后面列出。
      1. removeUIItem 函数删除页面列表中的相应项。
    1. 数据存储代码

      数据存储代码定义在 data.js 中。

      清单 11 数据存储代码
      data.js

       var storage = window[‘localStorage‘]; 
      
       function addDataItem(title)
       {
          if (navigator.onLine) // 在线状态
          {
              addServerItem(title);
          }
          else // 离线状态
          {
              var str = storage.getItem("toAdd");
              if(str == null)
              {
                  str = title;
              }
              else
              {
                  str = str + "," + title;
              }
              storage.setItem("toAdd", str);
          }
       } 
      
       function removeDataItem(title)
       {
          if (navigator.onLine) // 在线状态
          {
              removeServerItem(title);
          }
          else // 离线状态
          {
              var str = storage.getItem("toRemove");
              if(str == null)
              {
                  str = title;
              }
              else
              {
                  str = str + "," + title;
              }
              storage.setItem("toRemove", str);
          }
       } 
      
       function SyncWithServer()
       {
          // 如果当前是离线状态,不需要做任何处理
          if (navigator.onLine == false)return; 
      
          var i = 0;
          // 和服务器同步添加操作
          var str = storage.getItem("toAdd");
          if(str != null)
          {
              var addItems = str.split(",");
              for(i = 0; i<addItems.length; i++)
              {
                  addDataItem(addItems[i]);
              }
              storage.removeItem("toAdd");
          } 
      
          // 和服务器同步删除操作
          str = storage.getItem("toRemove");
          if(str != null)
          {
              var removeItems = str.split(",");
              for(i = 0; i<removeItems.length; i++)
              {
                  removeDataItem(removeItems[i]);
              }
              storage.removeItem("toRemove");
          } 
      
          // 删除界面中的所有便签
          var list = document.getElementById("list");
          while(list.lastChild != list.firstElementChild)
              list.removeChild(list.lastChild);
          if(list.firstElementChild)
              list.removeChild(list.firstElementChild);        
      
          // 从服务器获取全部便签,并显示在界面中
          var allItems = getServerItems();
          if(allItems != "")
          {
              var items = allItems.split(",");
              for(i = 0; i<items.length; i++)
              {
                  addUIItem(items[i]);
              }
          }
       }
      

      window.addEventListener("online", SyncWithServer,false);

      data.js 中的代码包含添加便签、删除便签和与服务器同步等数据操作。其中用到了 navigator.onLine 属性、online 事件、DOM
      Storage 等 HTML5 新功能。

    2. 添加便签:addDataItem
      1. 通过 navigator.onLine 判断是否在线。
      1. 如果在线,那么调用 addServerItem 直接把数据存储到服务器上。addServerItem 将在后面列出。
      1. 如果离线,那么把数据添加到 localStorage 的“toAdd”项中。
      • 删除便签:removeDataItem
      1. 通过 navigator.onLine 判断是否在线。
      1. 如果在线,那么调用 removeServerItem 直接在服务器上删除数据。removeServerItem 将在后面列出。
      1. 如果离线,那么把数据添加到 localStorage 的“toRemove”项中。
      • 数据同步:SyncWithServer

在 data.js 的最后一行,注册了 window 的 online 事件处理函数 SyncWithServer。当 online
事件发生时,SyncWithServer 将被调用。其功能如下。

      1. 如果 navigator.onLine 表示当前离线,则不做任何操作。
      1. 把 localStorage 中“toAdd”项的所有数据添加到服务器上,并删除“toAdd”项。
      1. 把 localStorage 中“toRemove”项的所有数据从服务器中删除,并删除“toRemove”项。
      1. 删除当前页面列表中的所有便签。
      1. 调用 getServerItems 从服务器获取所有便签,并添加在页面列表中。getServerItems 将在后面列出。
    1. 服务器相关代码

      服务器相关代码定义在 server.js 中。

时间: 2024-10-06 11:48:32

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

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

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

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

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

使用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