原文地址:http://www.qianduan.net/local-storage-of-html5.html

Robin 发表于 05. Jan, 2011, 分类: ShowCase , 18 条评论 »
标签:HTML5

html5带给我们的不仅仅是更多语义丰富的标签,还有更多更牛逼的特性,比如“离线存储”。 对于台式电脑来说,或者它并没有带来什么惊喜,但是对于移动设备来说离线存储简直就是一个神迹。对于任何拥有支持离线存储浏览器的移动设备,比如iphone,ipod touch,离线存储使得web前端工程师可以很容易的针对它们开发应用程序。

前面吹嘘了一段,不过说实在的,html5本地存储就目前来说还是很受限的。其一,浏览器限制,目前只有 Safari 3.1 and later, and in iPhone OS 2.0 and later. 提供了javascript database 原生支持,不过也有 Taffy DB 可以曲线救国。(还没有用过,不敢妄下结论。)。 其二,服务器端需要修改配置,旦如果是自己的服务器就很简单了。

下面就以一个简单的offline web app-note book 为例,记录一下为iphone/ipod touch开发web app的过程。不是经验,只是初探。

  1. 建立适合 iphone/ipod touch 的UI
  2. 数据的本地存储
  3. 文件的本地存储
  4. 完善这个app (不打算完善它了,有时间做一个实用的app专门介绍 iphone web app 的开发吧)

首先,适合iphone/ipod touch 的UI 它并不是本文的重点,有兴趣的同学可以移步这里 。这里只强调一点:你默认做的页面,放到iphone看会变的很窄,字很小。这是因为iphone用它320px宽的屏幕显示了一个默认980px宽的页面,你的内容被按比例缩小了。要解决这个问题很简单,只要在html的head区域加一个meta标记,具体语法请看这里 。 也就是这样:

这个问题解决之后我们就可以肆意的使用html5和css3来打造界面了,(针对设备开发可以不考虑兼容性,真是畅快淋漓呀。)

我大概做了个丑陋的界面:

html代码, CSS代码 (其实你可以不用看,最后有打包的代码)

完成了UI,我们就需要对数据进行处理了。

在开始“数据”的本地存储之前,我们先来了解一下client-side database storage API:

the client-side database storage API allows web applications to store structured data locally using a medium many web developers are already familiar with – SQL.--webkit blog

目前只有webkit核心的浏览器支持这一特性。你甚至都不能在w3c的html5工作草案中找到 (cs-db)client-side database 的详细描述。

首先我们要尝试建立一个数据库链接:

try {if(!window.openDatabase){  //检测浏览器是否支持cs-dbalert('not supported cs-db!');} else {var shortName = 'noteDB';var version = '1.0';var displayName = 'Note book database';var maxSize = 65536;//创建一个数据库var db = openDatabase(shortName,version,displayName,maxSize);}
} catch(e){  //尝试捕获错误if (e == 2){alert('Invalid database version.');} else {alert("Unknown error "+e+".");}
}

如果以上代码无误,你就会在safair或者chrome的开发者工具中看到这个数据库:

在右侧区域可以直接执行一些sql查询,但是我总是得到 “发生意外错误“0”。” 这样的结果,不知道是不是RP的问题。

接下来就是创建表,以及执行一些sql语句进行增删改查。

js执行sql的基本语法大致是这样的:

db.transaction(function (transaction){transaction.executeSql(sqlquery,[],dataHandler, errorHandler);}
);

其中transaction.executeSql中参数依次为:sql查询字符串,传递给sql查询的参数,数据处理句柄,错误处理句柄。其中只有第一项为必选,其余都为可选项。

第二个参数的用法大致是这样的:

transaction.executeSql("UPDATE people set age=? where name=?;",[ age, name ]);

查询字符串中的“ ?” 会被后面数组中的变量依次替换。

注意:以上我用了“大致”这个词,因为没有官方的文档 (W3C-web database),只是从一些其它文献以及自己判断得来,若有错误还请指正。

下面我们创建一张用来存储note的表:

db.transaction(function (transaction){transaction.executeSql('CREATE TABLE IF NOT EXISTS notes (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,titel TEXT, note TEXT NOT NULL, date DATE);',errorHandler);}
);

errorHandler是这样的:

function errorHandler(transaction, error){alert('Error was: '+ error.message +'(Code:'+ error.code +')');var fatal_error = true;if(fatal_error){return true;}return false;
}

error.message 是一段错误描述,error.code 是错误代码 (详情)

再看看如果从db中检索出数据并显示到页面上:

db.transaction(function (transaction){transaction.executeSql("SELECT * from notes;",[],dataHandler, errorHandler);}
);function dataHandler(transaction, results){var string = "";for (var i = 0; i" + row['titel'] + "";}var listConts = $('listCont');listConts.innerHTML = string;
}

可以看出,基本上和php之类后端语言操作大同小异。
更多代码可查看示例程序,不再一一罗列。

完成了数据的本地存储,就要将文件存储也搞定。为了实现文件的本地存储,html5搞了一个叫 manifest 的文件,这个文件就是一个缓存清单,把需要缓存在客户端的文件告诉浏览器。manifest是一个mimetype为 text/cache-manifest 的 纯文本文件。注意,这点很重要。

下面是一个manifest文件的例子:

NETWORK, CACHE, FALLBACK 都是可选的。

manifest文件必须以 CACHE MANIFEST 开头

其后需要下载并缓存的文件使用相对或绝对路径皆可,每个资源一行。

NETWORK段表明一些在线资源所在的域,所有这个域下的资源都不会被缓存,即使客户端处于离线状态,也会尝试去请求基于这些域的资源。

CACHE段还不是很明白

FALLBACK段下面每行都包含两部分内容,用空格分隔。后半部分是当前半部分路径不能访问时的备选路径(很拗),如上图就是,如果demoimages目录不能访问时,尝试访问images目录。

manifest文件介绍就到这里,下面创建我们自己的manifest文件:

我们只需要缓存两个文件即可,nbStyle.css 和 nbScript.js。还有index.html 本身,由于manifest文件会默认缓存引用自己的文件,所以index.html 不能在缓存列表中写出来:

CACHE MANIFEST
# version: 2010-01-20 22:30nbStyle.css
nbScript.js

就是这么简单了,我们将他保存为 notebook.manifest 文件,并和其它文件一起放在根目录。

最后一个问题,如果将notebook.manifest的mimetype标识为 text/cache-manifest 类型呢?我知道有两种方法:

1. 在站点根目录建立 .htaccess 文件,在其中声明.manifest 的mimetype ,这个需要修改下服务器的配置文件,我没有尝试成功。

2. php环境在apache目录寻找一个为 “mime.types” 的配置文件,在其最后添加一行:

text/cache-manifest            manifest

然后在index.html文件引用它:

搞定了这些东西,你就可以尝试用webkit访问你的应用,然后离线,再尝试使用它,程序应该也可以照常运行。

至此,html5的离线存储基本介绍完了,下面附上打包的代码,代码本身没有什么难度,只是我写的太烂了:

代码下载

其实还远没有完,缓存下来的文件如果被更新了怎么办呢?如何通知客户端更新缓存其实也有api,慢慢的再探索吧。非常期待与大家探讨html5相关的问题。

HTML5本地存储初探相关推荐

  1. HTML5本地存储——Web SQL Database

    在HTML5 WebStorage介绍了html5本地存储的Local Storage和Session Storage,这两个是以键值对存储的解决方案,存储少量数据结构很有用,但是对于大量结构化数据就 ...

  2. HTML5 本地存储

    HTML5 本地存储 1.sessionStorage 2.localStorage 3.Database Storage 4.globalStorage 5.兼容性 参考文献 本地持久化存储一直是本 ...

  3. HTML5本地存储之Web Storage篇

    2019独角兽企业重金招聘Python工程师标准>>> Web Storage是HTML5引入的一个非常重要的功能,在前端开发中经常用到,可以在客户端本地存储数据,类似HTML4的c ...

  4. HTML5本地存储不完全指南

    历史 在HTML5本地存储之前,如果我们想在客户端保存持久化数据,有这么几个选择: HTTP cookie.HTTP cookie的缺点很明显,最多只能存储4KB的数据,每个HTTP请求都会被传送回服 ...

  5. html5储存类型,html5本地存储-留言板

    HTML5每日一练之JS API-本地存储LocalStorage 留言板 | 前端开发网(W3Cfuns.com)! var Storage = { saveData:function()//保存数 ...

  6. HTML5本地存储——IndexedDB(二:索引)

    在HTML5本地存储--IndexedDB(一:基本使用)中介绍了关于IndexedDB的基本使用方法,很不过瘾,这篇我们来看看indexedDB的杀器--索引. 熟悉数据库的同学都知道索引的一个好处 ...

  7. HTML5本地存储——IndexedDB

    在HTML5本地存储--Web SQL Database提到过Web SQL Database实际上已经被废弃,而HTML5的支持的本地存储实际上变成了 Web Storage(Local Stora ...

  8. HTML5 本地存储和内容按需加载的思路和方法

    HTML5 本地存储和内容按需加载的思路和方法 作者:佚名 字体:[增加 减小] 来源:互联网 时间:04-07 16:05:09 我要评论 本文将着重介绍HTML5本地存储和内容按需加载的思路和方法 ...

  9. HTML5本地存储使用详解

    HTML5本地存储使用详解 前言 随着Web应用的发展,需要在用户本地浏览器上存储更多的应用数据,传统的cookie存储的方案已经不能满足发展的需求,而使用服务器端存储的方案则是一种无奈的选择.HTM ...

  10. HTML5 本地存储 localstorage 安全分析

    在HTML5本地存储出现以前,WEB数据存储的方法已经有很多,比如HTTP Cookie,IE userData,Flash Cookie,Google Gears.其实再说细点,浏览WEB的历史记录 ...

最新文章

  1. 设计模式篇之——命令设计模式
  2. 使用subprocessm模块管理进程
  3. Linux基础笔记_01
  4. Visual Studio 2008 十大新功能
  5. jsp mysql 注入_由Jsp+Mysql注入到root权限的全程展 【好久没有安全类文章了,转一篇看看】...
  6. python远程同步文件_Python实现的远程文件自动打包并下载功能示例
  7. 工厂中用计算机,计算机技术在工厂监控系统中的应用
  8. 生命在于学习——密码暴力破解
  9. 对于公司的管理者,如何解决Facebook操作者离职的问题,facebook能公司统一管理吗?会不会和Facebook真实身份注册有冲突,
  10. Ubuntu下鼠标无法点击解决方案
  11. 阿拉伯数字转人民币大写
  12. C++校内模拟赛-06水题
  13. oracle12c配置文档,Oracle12C安装配置文档
  14. vue框架如何将SPA项目改为SSR项目
  15. 【TS】泛型 Generics
  16. UOJ #115. 【UER #2】谣言的传播
  17. 小米双剑出鞘,红米2、小米4S所到之处尸横满地?
  18. 机器人学习笔记——机器人概述
  19. 视频剪辑用计算机,剪辑视频用的电脑该如何配置 真的配置越高越好?
  20. [5] Java中的static关键字

热门文章

  1. DELL电脑系统恢复出常值
  2. kvm系列之四:热添加技术
  3. GCP+WORDPRESS建站。
  4. 新买阿里云linux服务器如何设置账号密码xshell远程登陆
  5. 针对数据泵导出 (expdp) 和导入 (impdp)工具性能降低问题的检查表 (文档 ID 1549185.1)...
  6. Error:Could not find common.jar (android.arch.core:common:1.0.0)
  7. 欢迎来到德莱联盟(一)
  8. [转]ETL模型设计
  9. 下载SAP标准教程的方法
  10. AI 用神经网络实现序列到序列的学习