store.js 提供了一套跨浏览器的本地存储解决方案。javascript
// 将 'marcus' 存为 'username' store.set('username', 'marcus') //设置过时时间 var expiration = new Date().getTime() + 10000; store.set('bar', 'foo', expiration); // 获取 'username' store.get('username') // 删除 'username' store.remove('username') // 清空全部索引 store.clear() // 存储对象字面量 - store.js 内部使用了 JSON.stringify方法 store.set('user', { name: 'marcus', likes: 'javascript' }) // 获取存储的对象 - store.js 内部使用了 JSON.parse 方法 var user = store.get('user') alert(user.name + ' likes ' + user.likes) // 获取全部存储的值 store.getAll().user.name == 'marcus' // 遍历全部存储的值 store.forEach(function(val, key) { console.log(key, '==', val) })
store.js 优先选择 localStorage 来进行存储,在 IE6 和 IE7 降低级使用userData来达到目的。 没有使用 flash ,不会减慢你的页面加载速度。也没有使用 cookies ,不会使你的网络请求变得臃肿。html
store.js 依赖 JSON 来序列化数据进行存储。java
只需获取 [store.min.js] 或者 [store+json2.min.js] ,并经过script标签引入便可使用。node
store.enabled
flag若是你的产品使用了 store.js,使用前你首先要检查 store.enabled
标识:git
<script src="store.min.js"></script> <script> init() function init() { if (!store.enabled) { alert('Local storage is not supported by your browser. Please disabled "Private Mode", or upgrade to a modern browser') return } var user = store.get('user') // ... and so on ... } </script>
在使用localStorage的时候,虽然可用可是会抛出一个错误。例如在使用 Safari的private browsing 模式(无痕浏览模式)的时候就会发生这样的状况。 其余浏览器容许用户临时禁止localStorage的使用。 Store.js 会检测这些设置并相应的更改 store.enabled
标识。github
Introductory Screencast to Store.js 由 Jack Franklin制做。web
只需设置下global.localStorage,store.js 在 node.js也能够正常使用,以下:sql
global.localStorage = require('localStorage') var store = require('./store') store.set('foo', 1) console.log(store.get('foo'))
我的模式 Store.js 在浏览器开启了private mode模式(无痕浏览)的状况下可能会失效。 这就须要在使用 store.js前必定要检查 store.enabled
标识。npm
Saucelabs.com 给力 很是感谢Saucelabs.com对 store.js 进行了大范围的浏览器测试工做。能够去看看他们的网站,真的很棒。json
Firefox 3.0 & 2.0: 高于v1.3.6版本的再也不支持 FF 2 & 3 。 因此,若是你想要支持FF的古老版本,那你须要使用 v1.3.5 版本的 store.js。
重要提示: 在IE6和IE7中,若是你要存储键值对,那么不少特殊字符是不容许出如今关键字名称中的。 在@mferretti,提供了一种合适的变通方法,就是把这些特殊字符替换为t "___"。
若是不使用store.js,那么使用localStorage的时候,被存储的每一个值上都调用了一次toString方法。这就是说,你不能方便的对numbers、 objects 或者 arrays进行存取:
localStorage.myage = 24 localStorage.myage !== 24 localStorage.myage === '24' localStorage.user = { name: 'marcus', likes: 'javascript' } localStorage.user === "[object Object]" localStorage.tags = ['javascript', 'localStorage', 'store.js'] localStorage.tags.length === 32 localStorage.tags === "javascript,localStorage,store.js"
咱们想要的效果 (经过 store.js能够实现) 是
store.set('myage', 24) store.get('myage') === 24 store.set('user', { name: 'marcus', likes: 'javascript' }) alert("Hi my name is " + store.get('user').name + "!") store.set('tags', ['javascript', 'localStorage', 'store.js']) alert("We've got " + store.get('tags').length + " tags here")
JSON是JavaScript的原生序列化引擎。可是在使用store.js的时候,你不须要本身去对值进行序列化或反序列化,在每次调用 store.set() 和 store.get()的时候,store.js已经分别经过JSON.stringify() 和 JSON.parse() 实现了相同的效果。
一些浏览器并不支持原生的 JSON。因此,你须要同时引入 JSON.js。
没必要担忧。我以为没办法提供跨浏览器的 sessionStorage 。 然而,在 store.js上能够看到设置值的生存期的代码:
var storeWithExpiration = { set: function(key, val, exp) { store.set(key, { val:val, exp:exp, time:new Date().getTime() }) }, get: function(key) { var info = store.get(key) if (!info) { return null } if (new Date().getTime() - info.time > info.exp) { return null } return info.val } } storeWithExpiration.set('foo', 'bar', 1000) setTimeout(function() { console.log(storeWithExpiration.get('foo')) }, 500) // -> "bar" setTimeout(function() { console.log(storeWithExpiration.get('foo')) }, 1500) // -> null
对于浏览器来讲:能够到 http://marcuswestin.github.io... 来测试最新版本的 store.js。
对于本地测试:能够 npm install node-static && ./node_modules/node-static/bin/cli.js
后,访问 http://localhost:8080 来测试。
(注意: test.html 只能经过 http:// 或 https://来访问。 这是由于经过 file://协议来访问时,localStore 会失效。)
对于Nodejs:经过 npm install . localStorage && node test-node.js