因为太久没用这些东西,之前被人问起时只能勉强答出两个,并且连事件也不记得,只好把常用的列出来强化记忆了。
localStorage 和 sessionStorage 的 APIs 在行为表现上是一致的,以下以 localStorage 为例,而 globalStorage 因为不是标准,所以略过。
函数和属性:
setItem(key, value)
将 value 以 key 为名存入 localStorage。
key 和 value 理论上可接受任何类型,但实际会通过 String(value) 转换为字符串,所以需慎用,比如 Object 会转换成 '[object Object]',null 会转换成 'null'。
localStorage.setItem('hello', 'Chris')
localStorage.key(0) + ' ' + localStorage.getItem('hello') // 'hello Chris'
localStorage.clear()
var obj = { str: 'an object' }
localStorage.setItem(obj, { posts: [{}, {}] })
localStorage.key(0) // '[object Object]'
localStorage.getItem(obj) // '[object Object]'
var otherObj = { str: 'another object' }
localStorage.setItem(otherObj, true)
localStorage.getItem(obj) // 'true'
localStorage.clear()
localStorage.setItem(null, null)
localStorage.getItem(null) // 'null'
getItem(key)
要注意 String() 的问题。
若 key 不存在,getItem() 会返回 null,如果在 setItem() 时并没有进行严格验证的话,建议同时判断是否为 'null' 来确定是否存在。
访问 key/value 的其他方法
localStorage 可以像数组一样操作,而 key 也会作为普通对象的属性一样被访问。
localStorage['hello'] = 'world'
localStorage.hello // 'world'
localStorage.hello = 'Chris'
localStorage['hello'] // 'Chris'
removeItem() 和 clear()
一个删除单个,一个删除全部,不返回任何值,key 不存在时也不会报错。
key(keyID)
返回指定 ID 的 key 名字。
keyID 只接受整数,因为会通过 Math.floor(keyID) 来转换,所以支持非整数,如 '1.1'、'1a' 和 true 等等,只是结果为 NaN 时取 0;若不存在,返回 null。
已知问题:
- Chrome v25 和 Firefox v19 的行为不一样:Chrome 会将 keys 按照字符串大小进行正排序,而 Firefox 则几乎是乱序,不可预测
key的位置。
localStorage.setItem('google', 'what the hell?')
localStorage.setItem('miscrosoft', 'not bad')
localStorage.setItem('apple', 'great')
localStorage.key(0) // Chrome: apple
localStorage.key(1) // Chrome: google
length
返回 key 的总数。
事件
目前只支持一个事件:storage。
if (window.addEventListener) {
window.addEventListener("storage", handle_storage, false);
} else {
window.attachEvent("onstorage", handle_storage);
};
这段代码我偷懒从 Dive Into HTML5 搬过来的,专有的事件属性如下:
- key:不解释
- oldValue:旧值
- newValue:新值
- url:页面的 URL
url 有点特殊,原来是叫 uri 的,所以要兼容某些浏览器的话,最好两个都判断,较新的标准浏览器应该没有这个问题。
此事件不可终止,并且只有在 setItem()、removeItem() 和 clear() 确实影响了值才会触发:
localStorage.setItem('hello', 'world') // will fire
localStorage.clear() // will fire
localStorage.clear() // will not fire
另外,对触发页面的要求也很特别:会触发事件的页面并不是执行修改操作的页面,而是已打开的、共享同一个储存区的其他页面。
最后,事件绑定只能绑定在 window 上。
以上仅在 Chrome v25 和 Firefox v19 上测试过。
