localStorage

localStorage[sessionStorage](https://developer.mozilla.org/en-US/docs/Web/API/sessionStorage) 一样,都遵循同源策略,但是它是持续存在的。localStorage 首次出现于 Firefox 3.5。

当浏览器进入隐私浏览模式,会创建一个新的、临时的数据库来存储local storage的数据;当关闭隐私浏览模式时,该数据库将被清空并丢弃。

ps: 目前项目中,开启无痕浏览时,获取不到localStorage设置的值,对上面新的、临时的数据库不理解?

应注意,无论数据存储在 localStorage 还是 sessionStorage ,它们都特定于页面的协议

localStorage 中的键值对总是以字符串的形式存储。 (需要注意, 和js对象相比, 键值对总是以字符串的形式存储意味着数值类型会自动转化为字符串类型)。

检测浏览器支持

  1. function storageAvailable(type) {
  2. var storage;
  3. try {
  4. storage = window[type];
  5. var x = '__storage_test__';
  6. storage.setItem(x, x);
  7. storage.removeItem(x);
  8. return true;
  9. }
  10. catch(e) {
  11. return e instanceof DOMException && (
  12. // everything except Firefox
  13. e.code === 22 ||
  14. // Firefox
  15. e.code === 1014 ||
  16. // test name field too, because code might not be present
  17. // everything except Firefox
  18. e.name === 'QuotaExceededError' ||
  19. // Firefox
  20. e.name === 'NS_ERROR_DOM_QUOTA_REACHED') &&
  21. // acknowledge QuotaExceededError only if there's something already stored
  22. (storage && storage.length !== 0);
  23. }
  24. }

使用:

  1. if (storageAvailable('localStorage')) {
  2. // Yippee! We can use localStorage awesomeness
  3. }
  4. else {
  5. // Too bad, no localStorage for us
  6. }

可以使用storageAvailable('sessionStorage')检测sessionStorage。

方法

localStorage.setItem()localStorage.getItem()localStorage.removeItem()localStorage.clear()

  1. // 设置值
  2. localStorage.myCat = 'Tom';
  3. localStorage['myCat'] = 'Tom';
  4. localStorage.setItem('myCat', 'Tom');
  5. // 获取值
  6. localStorage.myCat; // 'Tom'
  7. localStorage['myCat']; // 'Tom'
  8. localStorage.getItem('myCat'); // 'Tom'

官方建议使用 setItem, getItem, removeItem 这些API,来防止与使用普通对象作为键值存储相关的 陷阱

为 localStorage 设置过期时间

  1. function set(key,value){
  2. var curtime = new Date().getTime();//获取当前时间
  3. localStorage.setItem(key,JSON.stringify({val:value,time:curtime}));//转换成json字符串序列
  4. }
  5. function get(key,exp)//exp是设置的过期时间
  6. {
  7. var val = localStorage.getItem(key);//获取存储的元素
  8. var dataobj = JSON.parse(val);//解析出json对象
  9. if(new Date().getTime() - dataobj.time > exp)//如果当前时间-减去存储的元素在创建时候设置的时间 > 过期时间
  10. {
  11. console.log("expires");//提示过期
  12. }
  13. else{
  14. console.log("val="+dataobj.val);
  15. }
  16. }

storage 事件

当存储数据发生变化时,会触发 storage 事件。值得特别注意的是,该事件不在导致数据变化的当前页面触发。如果浏览器同时打开一个域名下面的多个页面,当其中的一个页面改变 sessionStorage 或 localStorage 的数据时,其他所有页面的storage事件会被触发,而原始页面并不触发 storage 事件。可以通过这种机制,实现多个窗口之间的通信。(当然 ie 这个特例除外,它包含自己本事也会触发 storage 事件)。 例如我们全局下监听 storage 事件

  1. window.addEventListener("storage",function onStorageChange(event) {
  2. // event 对象中几个主要属性:
  3. console.log(event.key); //更新值得键
  4. console.log(event.oldValue); //更新前的值。如果该键为新增加,则这个属性为null。
  5. console.log(event.newValue); //更新后的值。如果该键被删除,则这个属性为null。
  6. // 如果 Storage 调用的是 clear 方法,则事件中的 key 、oldValue 、newValue 都是为 null
  7. console.log(event.url); //原始触发storage事件的那个网页的网址。
  8. });

参考

https://developer.mozilla.org/zh-CN/docs/Web/API/Storage/LocalStorage
https://www.html.cn/archives/10169