使用Web存储API

TODO:本文由 赤石俊哉 翻译整理,您可以将本文自由地用于学习交流。如需用于其他用途请征得作者的同意。
原文链接:Using the Web Storage API - Mozilla Developer Network (英文)


Web存储API提供了浏览器可以在本地安全存储键值对的一个机能,它比cookies更为直观。这篇文章将会简单阐述一下如何来简单地使用这种技术。

基础概念

存储对象是一个简单的键值存储,它跟对象类似,但是它们在页面读取后依然完整。键和值总是字符串(注意,整型数据也会自动地转为字符串,就像对象那样)。你可以像访问一个对象一样来访问这些值,或者使用方法:Storage.getItem()Storage.setItem()。下面这三行都是设置了colorSetting记录:

localStorage.colorSetting = '#a4509b';
localStorage['colorSetting'] = '#a4509b';
localStorage.setItem('colorSetting', '#a4509b');

Note: 强烈推荐使用Web存储API(setItem, getItem, removeItem, key, length)进行纯对象的键值操作来防止可能出现的隐患。

两种Web存储中包含的机能如下:

  • sessionStorage 为每一个页面访问session期间维持一个单独的存储空间(只要浏览器打开就一直维持,包括页面重载和重新存储)。

  • localStorage 做同样的事情,只不过在浏览器被关闭再打开后仍然维持着。

这些机能可以通过Window.sessionStorageWindow.localStorage属性(更准确的说,在支持的浏览器中,Window对象实现了WindowLocalStorageWindowSessionStorage对象,他们是由localStoragesessionStorage挂起的)——调用其中任何一个,都会创建一个Storage对象的实例,透过它,数据项目可以被设置,取回,和移除。每一个sessionStoragelocalStorage的源都是用不同的存储对象——它们是分辨运作和被控制的。

所以,第一次在文档中调用localStorage后,它会返回一个Storage对象,调用sessionStorage之后,他又会返回另一个Storage对象。它们都可以用同一种方式进行操控,但是都是彼此独立的。

localStorage 功能检测

为了能使用localStorage,我们应该先进行确认,当前的浏览器会话是否支持和允许使用它。

测试支持和可用性

如果浏览器支持localStorage,在它的window对象中就会有一个属性叫作localStorage。但是,由于种种原因,如果直接去断定这个属性是否存在可能会抛出异常。如果它确实存在,也没有保障我们就一定可以使用它,因为很多浏览器支持在设定中禁用localStorage。举个例子,那就是Safari,在隐私浏览模式下,他会给我们一个配额为0的空的localStorage对象,实际上就是使它无效化。我们在检测的时候,也应该把这一点考虑进来。

下面是一个用于检测localStorage是否支持以及可用的方法:

function storageAvailable(type) {
try {
var storage = window[type],
x = '__storage_test__';
storage.setItem(x, x);
storage.removeItem(x);
return true;
}
catch(e) {
return false;
}
}

你应该这样使用它:

if (storageAvailable('localStorage')) {
// Yippee! We can use localStorage awesomeness
}
else {
// Too bad, no localStorage for us
}

你可以用相同的办法来测试sessionStoragestorageAvailable('sessionStorage')

你可以参考一下localStorage功能检测简报(英文)

一个简单的例子

为了举例说明一些典型的Web存储用例,我们创建了一个简单的例子,叫它Web Storage Demo吧。登录页面提供了一个控件来自定义颜色,字体,和装饰图片:

当你选择不同的选项,页面会实时地更新,顺带一提,你的选项会被存储到localStorage里存储。所以当你离开页面重新载入它的时候,你的选择会被记住。

我们也提供了一个事件输出页面——如果你在另一个标签页中载入这个页面,那么你在登录页面中做出的任何选择之后,你会看到更新了的存储信息会被显示出来,因为StorageEvent被触发了。

Note: 你可以从这里查看源代码

检测你的数据是否被填充成功

拿上面的例子来说,在main.js中,我们将会测试存储对象是否已经被填入(也就是说页面是否之前就已经载入过了):

if(!localStorage.getItem('bgcolor')) {
populateStorage();
} else {
setStyles();
}

Storage.getItem()方法被用于从存储中获取数据项目。在这个例子中,我们测试bgcolor项目是否存在。如果不存在,我们运行populateStorage()来将已经存在的自定义值存入存储。如果已经有数据了,我们运行setStyle()以使用存储的值来更新页面的样式。

Note: 你也可以使用Storage.length来测试存储对象是否为空。

从存储中获取数据

就像之前我们所描述的,数据可以从存储中使用Storage.getItem()来获取。这个方法使用键来做参数,它会返回相应的数据的值。举个例子:

function setStyles() {
var currentColor = localStorage.getItem('bgcolor');
var currentFont = localStorage.getItem('font');
var currentImage = localStorage.getItem('image'); document.getElementById('bgcolor').value = currentColor;
document.getElementById('font').value = currentFont;
document.getElementById('image').value = currentImage; htmlElem.style.backgroundColor = '#' + currentColor;
pElem.style.fontFamily = currentFont;
imgElem.setAttribute('src', currentImage);
}

在这里,前三行从本地存储中取出数据,接下来我们使用这些值设置显示的表单元素。所以当我们重新读取页面的时候,它们会保持同步。最后,我们更新了页面上的样式和装饰图片,所以你的自定义数值都在重载页面之后重现了。

在存储中设置值

Storage.setItem()可以用于创建也可以用于更新数据的值。它需要两个参数——需要修改或者创建的键名,需要存储的值。

function populateStorage() {
localStorage.setItem('bgcolor', document.getElementById('bgcolor').value);
localStorage.setItem('font', document.getElementById('font').value);
localStorage.setItem('image', document.getElementById('image').value); setStyles();
}

populateStorage()方法在本地存储中设置了三个项目——背景颜色,字体,图片路径。然后运行setStyles()方法更新页面样式,等等。

我们也在每一个表单元素上包含了一个onchange句柄,当表单的值发生改变时,数据和样式会立刻进行更新。

bgcolorForm.onchange = populateStorage;
fontForm.onchange = populateStorage;
imageForm.onchange = populateStorage;

使用StorageEvent在存储做出改变时进行响应

StorageEvent会在Storage对象发生变化时进行相应。它不能很好地在发生改变的页面上进行相应,但是在同一个域名的页面之间同步任何变化时,这是会是一个不错的方法。在不同的域名中无法访问相同的存储对象。

在事件页面(events.js)中,只有如下的代码:

window.addEventListener('storage', function(e) {
document.querySelector('.my-key').textContent = e.key;
document.querySelector('.my-old').textContent = e.oldValue;
document.querySelector('.my-new').textContent = e.newValue;
document.querySelector('.my-url').textContent = e.url;
document.querySelector('.my-storage').textContent = e.storageArea;
});

这里我们添加了一个事件监听器给window对象,当当前源的存储对象发生改变时引发。就如你所能看见的,这个事件的参数包含了很多有用的信息——发生变化的键名,旧值,新值,发生变化的文档的URL,以及存储对象其自身。

删除数据记录

Web存储也提供了一对简单的方法来移除数据。在我们的demo中没有使用这些,把它们加到我们的项目里面来也不难。

  • Storage.removeItem()使用一个简单的参数(你想要移除的数据项目的键)来将它从域名下的存储对象中移除它。

  • Storage.clear()是一个无参方法,它会清空域名下所有的存储对象。

浏览器兼容性

桌面

特 性 Chrome Firefox(Gecko) Internet Explorer Opera Safari(Webkit)
localStorage 4 3.5 8 10.50 4
sessionStorage 5 2 8 10.50 4

移动

特 性 Android Firefox Mobile(Gecko) IE Phone Opera Mobile Safari Mobile
基础支持 2.1 ? 8 11 iOS 3.2

Storage 事件

当一个存储区域(本地存储和会话存储)被修改时,storage事件会被触发。

通用信息

规范 Web Storage
接口 StorageEvent
冒泡
可取消
目标 DefaultView(<window>)
默认动作

属性

属性 类型 描述
target readonly EventTarget 事件的目标(DOM树中最顶层的目标)
type readonly DOMString 事件的类型
bubbles readonly Boolean 事件是否冒泡(bubbles)
cancelable readonly Boolean 事件是否可以取消
key readonly DOMString(string) 被修改的键名
oldValue readonly DOMString(string) 旧的值
newValue readonly DOMString(string) 新的值
url readonly DOMString(string) 更新该键名的文档的地址
storageArea readonly Storage 被影响的存储对象

使用Web存储API存取本地数据的更多相关文章

  1. 渐进式web应用开发---ajax本地数据存储(四)

    在前几篇文章中,我们使用service worker一步步优化了我们的页面,现在我们学习使用我们之前的indexedDB, 来缓存我们的ajax请求,第一次访问页面的时候,我们请求ajax,当我们继续 ...

  2. IOS中NSUserDefaults的用法(轻量级本地数据存储)

    NSUserDefaults适合存储轻量级的本地数据,比如要保存一个登陆界面的数据,用户名.密码之类的,个人觉得使用NSUserDefaults是首选.下次再登陆的时候就可以直接从NSUserDefa ...

  3. 理解 Android 本地数据存储 API

    利用首选项.SQLite 和内部及外部内存 API 对于需要跨应用程序执行期间或生命期而维护重要信息的应用程序来说,能够在移动设备上本地存储数据是一种非常关键的功能.作为一名开发人员,您经常需要存储诸 ...

  4. HTML5权威指南--Web Storage,本地数据库,本地缓存API,Web Sockets API,Geolocation API(简要学习笔记二)

    1.Web Storage HTML5除了Canvas元素之外,还有一个非常重要的功能那就是客户端本地保存数据的Web Storage功能. 以前都是用cookies保存用户名等简单信息.   但是c ...

  5. 临时存存储页面上的数据---Web存储

    HTML5 Web存储的两种方法使用 localStorage和sessionStorage 参考: http://www.cnblogs.com/taoweiji/archive/2012/12/0 ...

  6. Android本地数据存储复习

    Android本地数据存储复习 Android无论是应用层还是系统层都需要在本地保存一些数据,尤其在应用层中使用的就更为普遍,大体有这么几种:SharedPreference,file,sqlite数 ...

  7. Windows 8 应用开发 - 本地数据存储

    原文:Windows 8 应用开发 - 本地数据存储      在应用中通常会遇到用户主动或被动存储信息的情况,当应用关闭后这些数据仍然会存储在本地设备上,用户下次重新激活应用时会自动加载这些数据.下 ...

  8. iOS开发技术分享(1)— iOS本地数据存储

    iOS开发技术分享(1)— iOS本地数据存储 前言: 我本是一名asp.net程序员,后来加入了iOS游戏开发队伍,到现在也有一年多的时间了.这一年来,每天都干到2.3点钟才睡觉,不为别的,只为了学 ...

  9. html5 之本地数据存储

    HTML5 提供了两种在客户端存储数据的新方法: localStorage - 没有时间限制的数据存储 sessionStorage - 针对一个 session 的数据存储 cookie与webSt ...

随机推荐

  1. python面试_总结01_概念和内置高阶函数

    - 简答题 1.请谈谈Python中is 和 == 的区别(代码演示) is用于比较两个变量是否引用了同一个内存地址,is表示的是对象标识符(object identity),作用是用来检查对象的标识 ...

  2. java内存区域模型和详解

    一,概述 java虚拟机运行时数据区模型图: 主要包括:程序计数器,java虚拟机栈,本地方法栈,java 堆,方法区(元空间). 其中堆和方法区由所有线程共享的数据区:程序计数器,java虚拟机栈, ...

  3. deepin 字符集安装

    deepin字符集安装 编辑 目录介绍 /usr/share/i18n/charmaps 这个目录下存放了该Linux操作系统可用字符集的安装包,如果你的操作系统上没有安装某个字符集可以到这个目录下寻 ...

  4. MySQL优化之索引解析

    索引的本质 MySQL索引或者说其他关系型数据库的索引的本质就只有一句话,以空间换时间. 索引的作用 索引关系型数据库为了加速对表中行数据检索的(磁盘存储的)数据结构 索引的分类 数据结构上面的分类 ...

  5. S5700上三层Vlan间隔离的例子

    转自:https://forum.huawei.com/enterprise/zh/forum.php?mod=viewthread&tid=247591 公司最近的无线覆盖做好了,但让人无语 ...

  6. SQL语句的使用,SELECT - 从数据库表中获取数据 UPDATE - 更新数据库表中的数据 DELETE - 从数据库表中删除数据 INSERT INTO - 向数据库表中插入数据

    SQL DML 和 DDL 可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL). SQL (结构化查询语言)是用于执行查询的语法. 但是 SQL 语言也包含用于更新. ...

  7. ArcGIS提取水系并进行生态敏感性分析

    1.前言 此前已经发表过一篇名为<ENVI提取水系并进行生态敏感性分析>的随笔,这篇是用ArcGIS进行水系提取,与前者的区别是上篇一般是对遥感影像进行处理,准确性较高:这篇是讲在没有遥感 ...

  8. Redis安装以及常见问题

    安装 下载 redis官网地址:https://redis.io/ centos安装 创建软件放置目录mkdir soft 进入soft目录并下载redis安装包. cd soft wget http ...

  9. Django orm Q查询补充

    Q的简单用法 from django.db.models import Q q = Q() q.children.append(("username", "lyj&quo ...

  10. RDMA相关的技术网站

    https://www.cnblogs.com/vlhn/p/7909893.html https://www.cnblogs.com/vlhn/ 这个家伙的博客写的还不错,可以参考.