前言


storage 其实是个很简单的东西,基本上只要知道 javascript 中对象的概念,然后读完此文,storage 的用法也就了然于胸了。

简单来说,你可以把 storage 想象成是储存在客户端(浏览器)中的一些 javascript 对象,那么有什么用呢?举个简单的例子,百度搜索会把你每次的搜索关键字用 storage(localStorage) 存储下来,那么下次你再搜索相同的内容的时候,它会优先将你曾经搜过的内容进行下拉展示。

关于 storage 的内容,可以用 chrome 下的 Resources 面板进行查看。

方法:

  1. clear() 删除所有值。ff 没有实现
  2. getItem(name) 根据指定的名字 name 获取对应的值
  3. key(index) 获得 index 位置处的值的名字
  4. removeItem(name) 删除由 name 指定的名值对
  5. setItem(name, value) 为指定的 name 设置一个对应的值

也可以用点语法和方括号语法来访问设置,但是建议用上面的方法。

还有一点要注意的是 value 必须是字符串

sessionStorage


顾名思义,sessionStorage 对象存储特定于某个会话的数据,也就是该数据只保持到浏览器关闭,或者更准确地说是保持到该页面标签关闭为止。对于同一个页面,在不同标签中打开,是拥有不同的 sessionStorage 对象的,而如果相同页面,刷新后,sessionStorage 对象也会重新开始。

// 设置
sessionStorage.setItem('name', 'hanzichi');
sessionStorage.age = '10';

// 读取
var name = sessionStorage.getItem('name'); // hanzichi
var age = sessionStorage.age; // 10

// 遍历
for (var i = 0, len = sessionStorage.length; i < len; i++) {
  var key = sessionStorage.key(i);
  var value = sessionStorage.getItem(key);
  console.log(key, value);
}
// age 10
// name hanzichi

// 也可以用 for in
for (var key in sessionStorage) {
  console.log(key, sessionStorage.getItem(key));
}

// 删除
delete sessionStorage.name;
sessionStorage.removeItem('age');

因为 sessionStorage 对象绑定于某个服务器会话,所以当文件在本地运行的时候是不可用的。sessionStorage 对象应该主要用于仅针对会话的小段数据的存储,如果需要跨域会话存储数据,那么就要使用 localStorage 了。

localStorage


localStorage 和 sessionStorage 大抵相同。可以多页面访问同一个 localStorage 对象,但是页面必须来自同一域名(子域名无效),使用同一种协议,同一个端口(同源策略)。

关于 localStorage 的使用方法,可以参考上面 sessionStorage 的使用。

Storage 事件


对 Storage 对象进行任何修改,都会在文档上触发 Storage 事件。当通过属性或 setItem() 方法保存数据,使用 delete 操作符或者 removeItem() 删除数据,或者调用 clear() 方法时,都会发生该事件。这个事件的 event 对象有如下属性。

  1. domain 发生变化的存储空间的域名
  2. key 设置或者删除的键名
  3. newValue 如果是设置值,则是新值;如果是删除键,则是 null
  4. oldValue 键被更改之前的值

遗憾的是,webkit(chrome)还不支持这个事件,尽管 IE8 以及 ff 支持其部分属性,但因为 chrome 的不支持,注定其到目前为止只是个鸡肋。

EventUtil.addHandler(document, 'storage', function(e) {
  console.log(e.domain, e.key, e.newValue, e.oldValue);
});

2015-12-02 更:

storage 搭配 document.domain 有一些诡异的现象,设置 document.domain 大多数情况是为了能够跨域(二级域名跨一级域名)请求数据。

比如我在二级域名 a.abc.com 下的一个 a.htm 文件写了这样的代码并运行:

document.domain = 'abc.com';
localStorage.setItem('name', 'hanzichi');

接着在相同目录的 b.htm 文件添上如下代码:

alert(localStorage.getItem('hanzichi'));

在 PC 端直接弹出 'hanzichi',并且我们可以看到 localStorage 的数据存储在 a.abc.com 的域名下。

但是在移动端试了三款浏览器(chrome、2345、UC),只有 chrome Ok。将 b.htm 文件也添上 document.domain 就 ok 了。

document.domain = '2345.com';
alert(localStorage.getItem('name'));

至于原因,我也布吉岛...

2016-02-23:

需要进一步考虑。虽然 localStorage 的机制易于实现,但是它的一些控制机制却是非常复杂的。你需要考虑到缓存带给你的所有问题,比如缓存失效(什么时候需要删除缓存?),缓存丢失(当你希望数据在缓存中的时候它并不在怎么办?),还有当缓存满的时候你怎么办?

拥抱 HTML5:storage 简介以及使用方法的更多相关文章

  1. HTML5 Storage API

    原文:HTML5 Storage API Web Storage是HTML5引入的一个非常重要的功能,可以在客户端本地存储数据,类似HTML4的cookie,但可实现功能要比cookie强大的多. 在 ...

  2. 一篇文章图文并茂地带你轻松学会 HTML5 storage

    html5 storage api localStorage 和 sessionStorage 是 html5 新增的用来存储数据的对象,他们让我们可以以键值对的形式存储信息. 为什么要有 stora ...

  3. HTML5 Audio/Video 标签,属性,方法,事件汇总

    HTML5 Audio/Video 标签,属性,方法,事件汇总 (转) 2011-06-28 13:16:48   <audio> 标签属性:src:音乐的URLpreload:预加载au ...

  4. NetCat简介与使用方法

    精品学习网考试频道小编应广大考生的需要,特为参加考试的考生策划了“NetCat简介与使用方法”专题等有关资料,供考生参考! 在入侵中它是最经典的工具之一 ,NetCat被所有的网络安全爱好者和研究者称 ...

  5. HTML5 Audio/Video 标签,属性,方法,事件汇总 (转)

    HTML5 Audio/Video 标签,属性,方法,事件   <audio> 标签属性:src:音乐的URLpreload:预加载autoplay:自动播放loop:循环播放contro ...

  6. [转帖]HTML5 Audio/Video 标签,属性,方法,事件汇总

    HTML5 Audio/Video 标签,属性,方法,事件汇总 <audio>标签属性: src:音乐的URL preload:预加载 autoplay:自动播放 loop:循环播放 co ...

  7. PHP Socket(套接字连接)扩展简介和使用方法

    PHP socket扩展是基于流行的BSD sockets,实现了和socket通讯功能的底层接口,它可以和客户端一样当做一个socket服务器. 使用这些函数时请注意,虽然他们中有很多和C函数同名的 ...

  8. nc之一:NetCat简介与使用方法

    精品学习网考试频道小编应广大考生的需要,特为参加考试的考生策划了“NetCat简介与使用方法”专题等有关资料,供考生参考! 在入侵中它是最经典的工具之一 ,NetCat被所有的网络安全爱好者和研究者称 ...

  9. html5不能播放视频的方法

    html5不能播放视频的方法H5不能播放视频的方法 格式工厂转换成 AVC 注意音频流 采样率和比特率 设置低一点 不然播放会卡住 还有点击播放必须要click 不要用touchstart没效果的

随机推荐

  1. go sync.Mutex 设计思想与演化过程 (一)

    go语言在云计算时代将会如日中天,还抱着.NET不放的人将会被淘汰.学习go语言和.NET完全不一样,它有非常简单的runtime 和 类库.最好的办法就是将整个源代码读一遍,这是我见过最简洁的系统类 ...

  2. W3School-CSS 边框(border)实例

    CSS 边框(border)实例 CSS 实例 CSS 背景实例 CSS 文本实例 CSS 字体(font)实例 CSS 边框(border)实例 CSS 外边距 (margin) 实例 CSS 内边 ...

  3. SQLServer 数据修复命令DBCC一览

    1. DBCC CHECKDB  重启服务器后,在没有进行任何操作的情况下,在SQL查询分析器中执行以下SQL进行数据库的修复,修复数据库存在的一致性错误与分配错误. use master decla ...

  4. mysql IP转换函数

    1.将字符串类型的实际IP转换成十进制数值型的 SELECT INET_ATON('209.207.224.40'); 执行结果:

  5. Macbook无法上网,访问不了appstore、safria、网易云等,但QQ、谷歌浏览器可以用--解决方案

    ---------------------我是分割线  update 2016-09-22 20:55:22----------------------------- 发现之前那个方法也是不稳定,后来 ...

  6. C++ 中 typename

    声明template参数时, 前缀关键字class和typename可以互换; 使用关键字typename标识嵌套从属类型名称, 但不需在基类列表和成员初始化列表内使用. 从属名称(dependent ...

  7. 又是周六了-MySQL特训

    hi 又是周六,又是磨蹭个一上午~午饭后开始吧 1.MySQL -----子查询与连接(三)----- ----使用INSERT...SELECT插入记录 --数据库内容的英文版本 由于我的WAMP中 ...

  8. git 学习使用总结三(远程仓库操作)

    这篇文章仅供自己以后翻阅加深记忆,要系统的学习 git 教程(中文版),请移步到 liaoxuefeng.com 学习 git 教程部分. pull, fetch, clone, push, chec ...

  9. USB hacker Collection

    This blog contains some ideas and tricks about USB hacking.

  10. Oracle之多行记录变一行记录,行变列,并排序(wmsys.wm_concat)

    原帖:http://www.cnblogs.com/nayitian/p/3231734.html wmsys.wm_concat Definition: The Oracle PL/SQL WM_C ...