HTML5 简介(六):本地存储简明教程

HTM5 涉及存储的特性一共有三个,分别是 Web StorageWeb SQL DatabaseIndexedDB。其中支持最广泛的是 Local Storage,IE8 开始竟然就支持了。而其他主流浏览器也在好几个版本之前就已经支持。而 Web SQL Database 目前 IE 和 Firefox 都不支持,IndexedDB 则 Safari 和 iOS 均不支持(嗯,这些新特性 Chrome 都支持)。这篇文章主要讲 Local Storage。

基本方法

Web Storage 主要存储键/值对。它的使用非常简单:

// 存储
localStorage.setItem('Name', 'Shed');
localStorage.setItem('Age', 9);       // 方式1
localStorage.Gender = 'Unspecified';  // 方式2
// 读取
var name = localStorage.getItem('Name'); // 方式1
var gender = localStorage['Gender'];     // 方式2
var age = localStorage.Age;              // 方式3
// 删除
localStorage.removeItem('Gender');
localStorage.clear();

上述「存储」的两种方法中,方式 1 和方式 2 的区别为:只有键为以字母开头的时候才能用方式 2,并且方式 1 不会返回任何内容,而方式 2 会返回设置的值。

还有一些稍微不常用的方法,如下:

// local storage 存储的条目数
var length = localStorage.length;

// 内部节点序号为 i 的条目的值, 从 0 开始
var i = 1;
var val = localStorage.key(i);

这里需要解释一下key方法。标准并没有规定所谓的「内部节点序号」的生成方式,所以并不能简单地假设key(i)会返回第 i-1 次插入的值。实际上,标准是这么说的:

The key(n) method must return the name of the nth key in the list. The order of keys is user-agent defined, but must be consistent within an object so long as the number of keys doesn’t change. (Thus, adding or removing a key may change the order of the keys, but merely changing the value of an existing key must not.) If n is greater than or equal to the number of key/value pairs in the object, then this method must return null.

也就是说,只能保证在不增加记录的情况下每个值的序号不变,仅此而已。

storage 事件

HTML5 还为我们带来了和 Storage 相关的事件。事件发生有两个条件:

  1. localStorage 的内容被改变;
  2. 改变发生在另一个网页中(很多人都忽略了这个条件)。
window.addEventListener('storage', function(e) {
    var key = e.key;
    var old_value = e.oldValue;
    var new_value = e.newValue;
    var url = e.url;
}, false);

事件所包含的参数中,前三个可以自我解释。第四个的含义是触发事件的 URL。

HTML5demos.com 为我们提供了一个 Storage Event 的演示。打开两个窗口,修改其中一个窗口中文本框的内容,另一个窗口的内容也跟着发生了变化。它不仅使用了storage事件,还使用了keyup事件。

容量限制

每个域名下的 localStorage 可以存储 5M 的数据。需要说明的是,这个大小并不是标准强制规定的,只是一个建议。然而,所有浏览器都采纳了这个数值。

如果超过了限额,则会抛出QUOTA_EXCEEDED_ERR异常。那么,5M 大小可以存储多少数据呢?网上有很多类似的测试,比如这里,可以测试你的浏览器最多可以保存多少个字符。

localStorage 划分方法

localStorage 是按照 scheme + hostname + unique port 来区分的。需要解释一下 scheme,即 http/https,所以 http://example.comhttps://example.com 的 localStorage 是不能互相访问的。

本文作者为,最后修订于

讨论