HTM5 涉及存储的特性一共有三个,分别是 Web Storage,Web SQL Database 和 IndexedDB。其中支持最广泛的是 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 相关的事件。事件发生有两个条件:
- localStorage 的内容被改变;
- 改变发生在另一个网页中(很多人都忽略了这个条件)。
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.com
和 https://example.com
的 localStorage 是不能互相访问的。