`
jiangzhenghua
  • 浏览: 592329 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

HTML5本地存储不完全指南

 
阅读更多

历史

在HTML5本地存储之前,如果我们想在客户端保存持久化数据,有这么几个选择:

  1. HTTP cookie。HTTP cookie的缺点很明显,最多只能存储4KB的数据,每个HTTP请求都会被传送回服务器,明文传输(除非你使用SSL)。
  2. IE userData。userData是微软在上世纪90年代的浏览器大战时推出的本地存储方案,借助DHTML的behaviour属性来存储本地数据, 允许每个页面最多存储64K数据,每个站点最多640K数据,userData的缺点显而易见,它不是Web标准的一部分,除非你的程序只需要支持IE, 否则它基本没什么用处。
  3. Flash cookie。Flash cookie的名字有些误导,它实际上和HTTP cookie并不是一回事,或许它的名字应该叫做"Flash本地存储”,Flash cookie默认允许每个站点存储不超过100K的数据,如果超出了,Flash会自动向用户请求更大的存储空间,借助Flash的 ExternalInterface接口,你可以很轻松地通过Javascript操作Flash的本地存储。Flash的问题很简单,就是因为它是 Flash。
  4. Google Gears。Gears是Google在07年发布的一个开源浏览器插件,旨在改进各大浏览器的兼容性,Gears内置了一个基于SQLite的嵌入式 SQL数据库,并提供了统一API对数据库进行访问,在取得用户授权之后,每个站点可以在SQL数据库中存储不限大小的数据,Gears的问题就是 Google自己都已经不用它了。

现状

我们现在通常所说的HTML5本地存储,一般指的是
Web Storage规范,这个标准曾经是HTML5规范的一部分,但后来因为种种原因从HTML5规范中分离了出来。但是除了Web Storage,HTML5的本地存储标准还有另外2个竞争者:Web SQL Database和IndexedDB。下面就让我们依次来看看这3个规范吧。

Web Storage

Web Storage是目前得到支持最广泛的HTML5本地存储规范:IE 8+、FF 3.5+、Safari 4+、Chrome 4+、Opera 10.5+,以及iPhone 2+和Android 2+都已经支持Web Storage,要判断你的浏览器是否支持Web Storage,可以使用下面这个函数:

代码 复制代码
  1. function supports_html5_storage() {   
  2.     try {   
  3.         return 'localStorage' in window && window['localStorage'] !== null;   
  4.     } catch (e) {   
  5.         return false;   
  6.     }   
  7. }  
function supports_html5_storage() {
    try {
        return 'localStorage' in window && window['localStorage'] !== null;
    } catch (e) {
        return false;
    }
}


HTML5 Storage的使用非常简单:

代码 复制代码
  1. var foo = localStorage.getItem("bar");   
  2. // ...   
  3. localStorage.setItem("bar", foo);  
var foo = localStorage.getItem("bar");
// ...
localStorage.setItem("bar", foo);


你也可以写成下面这样:

代码 复制代码
  1. var foo = localStorage["bar"];   
  2. // ...   
  3. localStorage["bar"] = foo;  
var foo = localStorage["bar"];
// ...
localStorage["bar"] = foo;


如果要将某个key从存储空间删除,可以调用removeItem:

代码 复制代码
  1. localStorage.removeItem('foo');  
localStorage.removeItem('foo');



你也可以像遍历数组那样遍历存储的所有键值对象:

代码 复制代码
  1. for(var i=0; ivar key = localStorage.key(i);   
  2.     console.log(key + ":" + localStorage[key]);   
  3. }  
for(var i=0; ivar key = localStorage.key(i);
    console.log(key + ":" + localStorage[key]);
}


如果你的程序需要在不同页面访问同一个值,你可能需要了解这个值是否已经被其他页面改变了,这可以通过向浏览器注册storage事件来实现:

代码 复制代码
  1. window.addEventListener('storage', function(e) {   
  2.     console.log(e.key + "'s value is changed from '" +   
  3.         e.oldValue + "' to '" + e.newValue + "' by " + e.url);   
  4. }, false);   
  5.   
  6. //A页面   
  7. localStorage['foo'] = 'bar';   
  8.   
  9. //B页面   
  10. localStorage['foo'] = 'newBar';  
window.addEventListener('storage', function(e) {
    console.log(e.key + "'s value is changed from '" +
        e.oldValue + "' to '" + e.newValue + "' by " + e.url);
}, false);

//A页面
localStorage['foo'] = 'bar';

//B页面
localStorage['foo'] = 'newBar';


这时你应该会在A页面的Console中看到:

foo’s value is changed from ‘bar’ to ‘newbar’ by http://localhost/test.html

要注意的是,storage事件仅仅只是通知你某个键对应的值已经发生了改变,你没有办法在回调中阻止这个改变发生。

HTML5 Storage看起来不错,那它有没什么缺点呢?好问题。要说HTML5 Storage的缺点,唯一的问题就是它默认的QUOTA只有5MB,并且你没办法通过程序自行或是提示用户来增加存储空间。唯一的办法就是用户自己打开 浏览器的设置,并手动修改QUOTA的大小,如果超出了5MB的限制,你将会遇到一个“QUOTA_EXCEEDED_ERR”的错误。

Web SQL Database

Web SQL Database是一个已经废弃的规范,但是鉴于除了IE和Firefox,其他浏览器都已经实现了Web SQL Database,并且它还具有一些HTML5 Storage所不具有的特性,所以还是值得了解一下的。

Web SQL Database就像它的名字那样,就是一个让你可以在Web上直接使用的SQL数据库,你要做的就是打开数据库,然后执行SQL,和你对Mysql做的事情没什么两样:

代码 复制代码
  1. openDatabase('documents''1.0''Local document storage'5*1024*1024,   
  2. function (db) {   
  3.     db.changeVersion('''1.0', function (t) {   
  4.         t.executeSql('CREATE TABLE docids (id, name)');   
  5.     }, error);   
  6. });  
openDatabase('documents', '1.0', 'Local document storage', 5*1024*1024,
function (db) {
    db.changeVersion('', '1.0', function (t) {
        t.executeSql('CREATE TABLE docids (id, name)');
    }, error);
});


关于Web SQL Database的更多介绍,可以参看这篇指南

但是它的缺点也同样明显。最大的问题就出在SQL上,实际上并不存在一种叫做SQL的标准结构化查询语言,我们平常使用的实际上是MS SQL、Oracle SQL、MySQL SQL、postgre SQL或者SQLite SQL(尽管有一个叫做SQL-92的规范,但它基本形同虚设),更进一步,甚至都不存在SQLite SQL,我们使用的实际上是SQLite x.y.z SQL,而这也就是Web SQL Database最大的问题,它无法统一各个浏览器厂商实现的SQL语言,如果你的某条Web SQL查询只能在Chrome上运行,这还能叫做标准吗?

所以,如果你现在访问
Web SQL Database的规范页面,你会在顶部看到这样一则声明:
这个规范已经陷入了一个僵局:目前的所有实现都是基于同一个SQL后端(SQLite),但是我们需要更多的独立实现来完成标准化,所以除非有厂商愿意独立实现这个规范,否则当前的SQL规范只能采用SQLite的SQL方言,而作为一个标准,这是不可接受的。

IndexedDB

最后我们要介绍的就是
IndexedDB了,相比其他两个规范,目前只有Firefox实现了IndexedDB(顺便提一下,Mozilla表示它们永远不会去实现Web SQL Database),不过Google已经表示正在考虑在Chrome中加入IndexDB支持

IndexedDB引入了一个object store的概念,这有点像是一个SQL Database,你可以在“数据库”中存储“记录”,并且每条“记录”可以拥有很多“字段",每个字段都有一个特定的数据类型,你可以选择记录的子集, 并使用“光标”进行遍历,同时object store中的所有变更都是基于“事务”的。

下面让我们来看一个小例子:

代码 复制代码
  1. var request = window.indexedDB.open("CandyDB",   
  2.                                     "My candy store database");   
  3. request.onsuccess = function(event) {   
  4.   var db = event.result;   
  5.   if (db.version != "1") {   
  6.     // User's first visit, initialize database.   
  7.     var createdObjectStoreCount = 0;   
  8.     var objectStores = [   
  9.       { name: "kids", keyPath: "id", autoIncrement: true },   
  10.       { name: "candy", keyPath: "id", autoIncrement: true },   
  11.       { name: "candySales", keyPath: "", autoIncrement: true }   
  12.     ];   
  13.   
  14.     function objectStoreCreated(event) {   
  15.       if (++createdObjectStoreCount == objectStores.length) {   
  16.         db.setVersion("1").onsuccess = function(event) {   
  17.           loadData(db);   
  18.         };   
  19.       }   
  20.     }   
  21.   
  22.     for (var index = 0; index < objectStores.length; index++) {   
  23.       var params = objectStores[index];   
  24.       request = db.createObjectStore(params.name, params.keyPath,   
  25.                                      params.autoIncrement);   
  26.       request.onsuccess = objectStoreCreated;   
  27.     }   
  28.   }   
  29.   else {   
  30.     // User has been here before, no initialization required.   
  31.     loadData(db);   
  32.   }   
  33. };  
var request = window.indexedDB.open("CandyDB",
                                    "My candy store database");
request.onsuccess = function(event) {
  var db = event.result;
  if (db.version != "1") {
    // User's first visit, initialize database.
    var createdObjectStoreCount = 0;
    var objectStores = [
      { name: "kids", keyPath: "id", autoIncrement: true },
      { name: "candy", keyPath: "id", autoIncrement: true },
      { name: "candySales", keyPath: "", autoIncrement: true }
    ];

    function objectStoreCreated(event) {
      if (++createdObjectStoreCount == objectStores.length) {
        db.setVersion("1").onsuccess = function(event) {
          loadData(db);
        };
      }
    }

    for (var index = 0; index < objectStores.length; index++) {
      var params = objectStores[index];
      request = db.createObjectStore(params.name, params.keyPath,
                                     params.autoIncrement);
      request.onsuccess = objectStoreCreated;
    }
  }
  else {
    // User has been here before, no initialization required.
    loadData(db);
  }
};


关于Indexed的更多介绍可以参看Mozilla Blog的这篇指南。

--------
本文编译整理自:Mark Pilgrim的
Dive Into HTML5 第七章 HTML5本地存储,编译:@yuanyiz。

分享到:
评论

相关推荐

    HTML5多媒体开发指南

    本书还介绍了一些HTML5新标记,比如简化的doctype标记,另外,还介绍了本地存储、拖放和geolocation功能。本书通过详细的代码示例举例说明了所讨论的技术。通过本书的学习,读者可以使用HTML5开发出炫目的多媒体应用...

    HTML5移动Web开发指南.pdf

    第3章 HTML5规范的本地存储 23 第4章 移动Web的离线应用 34 第5章 移动设备的常见HTML5表单元素 40 第6章 移动Web界面样式 48 第7章 Geolocation地理定位 74 第8章 轻量级框架jQuery Mobile初探 79 第9章 重量级富...

    HTML5用户指南

    一个关于html5的技术讲解文档,主要目录如下: 第1章 主要结构  [head]  使用新的html 5结构化元素  使用css样式化html 5  何时使用新的html 5结构化元素  小结 第2章 文本  构造主要内容区域  添加博客...

    HTML5开发相关资料集合

    教程名称: HTML5开发相关资料集合【】Adobe-HTML_5技术培训【】Cocos2D-HTML5开源2D游戏引擎【】HTML5-本地存储【】HTML5与CSS3权威指南【】HTML5与手机游戏的未来_磊友科技_赵霏【】HTML5中文参考手册【】HTML5...

    html5webpdf

    第3章 HTML5规范的本地存储 第4章 移动WEB的离线应用 第5章 移动设备的常见HTML5表单元素 第6章 移动WEB界面样式 第7章 GEOLOCATION地理定位 第8章 轻量级框架JQUERY MOBILE初探 第9章 重量级富框架SENCHA TOUCH入门...

    HTML5与CSS3

    第七章本地存储 第八章离线应用程序 第九章通信API 第十章使用Web Workers处理线程 第十一章获取地理位置的信息 第十二章CSS 3概述 第十三章选择器 第十四章使用选择器在页面中插入内容 第十五章文字与字体相关样式 ...

    ActionScript开发人员指南中文版

    加密的本地存储区 第章:在AIR中使用本地SQL数据库 关于本地SQL数据库 创建和修改数据库 操作SQL数据库数据 使用同步和异步数据库操作 对SQL数据库使用加密 使用SQL数据库的策略 第章:使用字节数组 读取并写入...

    webgl编程指南及源码2/2

    《WebGL编程指南》 第1 章 WebGL 概述 1 WebGL 的优势 3 使用文本编辑器开发三维应用 3 轻松发布三维图形程序 4 充分利用浏览器的功能 5 学习和使用WebGL 很简单 5 WebGL 的起源 5 WebGL 程序的结构 6 总结...

    WebGL编程指南压缩包

    《WebGL编程指南》 第1 章 WebGL 概述 1 WebGL 的优势 3 使用文本编辑器开发三维应用 3 轻松发布三维图形程序 4 充分利用浏览器的功能 5 学习和使用WebGL 很简单 5 WebGL 的起源 5 WebGL 程序的结构 6 总结...

    WebGL编程指南

    《WebGL编程指南》 第1 章 WebGL 概述 1 WebGL 的优势 3 使用文本编辑器开发三维应用 3 轻松发布三维图形程序 4 充分利用浏览器的功能 5 学习和使用WebGL 很简单 5 WebGL 的起源 5 WebGL 程序的结构 6 总结...

    webgl编程指南及源码1/2

    《WebGL编程指南》 第1 章 WebGL 概述 1 WebGL 的优势 3 使用文本编辑器开发三维应用 3 轻松发布三维图形程序 4 充分利用浏览器的功能 5 学习和使用WebGL 很简单 5 WebGL 的起源 5 WebGL 程序的结构 6 总结...

    tvgids:使用tvgids.nl API的在线荷兰电视指南

    该网页旨在替代 ,提供了一种快速使用的界面,该界面可以保存HTML5本地存储中的首选项(例如,喜欢的频道),而不需要注册帐户。 可从获得工作版本。 特征 123个频道的完整节目清单。 请在2天之前和2天之前查看...

    Eclipse权威开发指南2.pdf

    1.2 不仅仅是工具的宿主,Eclipse 还作为客户端应用程序的 宿主...... 5 1.3 什么是Eclipse?...... 6 1.3.1 工具与应用程序的集成平台..... 6 1.3.2 Java开发环境..... 7 1.3.3 开源社区..... 8 1.3.4 Eclipse...

    Eclipse权威开发指南3.pdf

    1.2 不仅仅是工具的宿主,Eclipse 还作为客户端应用程序的 宿主...... 5 1.3 什么是Eclipse?...... 6 1.3.1 工具与应用程序的集成平台..... 6 1.3.2 Java开发环境..... 7 1.3.3 开源社区..... 8 1.3.4...

    ActionScript 3.0 开发人员指南 (AS3开发帮助文档)

    第 39 章 : 存储本地数据 第 40 章 : 在 AIR 中使用本地 SQL 数据库 第 41 章 : 使用字节数组 第 42 章 : 网络和通信基础知识 第 43 章 : 套接字 第 44 章 : HTTP 通信 第 45 章 : 与其他 Flash Player 和 AIR...

    使用Python进行爬虫的初学者指南(抓取提取数据的步骤)

    Web抓取有助于将这些非结构化数据,并将其以自定义和结构化的形式存储到本地或数据库中。如果您是为了学习的目的而抓取web页面,那么您不太可能会遇到任何问题,在不违反服务条款的情况下,自己进行一些web抓取来...

Global site tag (gtag.js) - Google Analytics