在开发 Web 应用时,开发者有时需要在本地存储数据。当前浏览器支持 cookie 存储,但其大小有 4KB 的限制。这对于一些 Ajax 应用来说是不够的。更多的存储空间需要浏览器本身或是插件的支持,如 Google Gears 和 Flash。不过开发人员需要通过检测当前浏览器所支持的插件类型来使用对应的接口。 HTML5 中新引入了 DOM Storage 机制,通过使用键值对在客户端保存数据,并且提供了更大容量的存储空间。本文将详细论述 HTML5 对本地存储的支持,并对存储事件绑定和数据存储与 JSON 的结合使用进行讨论。当一些老版本的浏览器不支持 DOM Storage 时,可以考虑用其他的技术如 Dojo 来实现相同的功能。本文也会对其进行简单的介绍。
HTML5 是下一代 HTML 标准,开始吸引越来越多人的目光。HTML5 的 DOM Storage 机制提供了一种方式让程序员能够把信息存储到本地的计算机上,在需要时获取。这点和 cookie 相似,区别是 DOM Storage 提供了更大容量的存储空间。
目前,在客户端保存数据使用最多的是 cookie,但 cookie 的大小上限为 4KB,并且每次请求一个新页面时 cookie 都会被发送过去。更多的存储空间需要浏览器本身或是插件的支持,例如只在 Internet Explorer 上使用的 userData,需要额外安装插件的 Google Gears 和 Flash。现在,HTML5 提供了一种标准的接口,使程序员可以简单地访问存储的数据。由于键值对存储在本地计算机上,在页面加载完毕后可以通过 JavaScript 来操作这些数据。
DOM Storage
示例应用程序:用户注册
本文使用的示例应用程序是一个简单的用户注册过程,表单包含三个字段:name、age 和 address,我们将其拆分为两个表单,分两个页面显示。借助简化了的数据模型,主要介绍如何利用 DOM Storage 功能处理表单跨页问题。
DOM Storage 两个分类
DOM Storage 分为 sessionStorage 和 localStorage。
localStorage 对象和 sessionStorage 对象使用方法基本相同,它们的区别在于作用的范围不同。sessionStorage 用来存储与页面相关的数据,它在页面关闭后无法使用。而 localStorage 则持久存在,在页面关闭后也可以使用。
DOM Storage 接口
下面是 DOM Storage 的接口定义:
- interface Storage {
- readonly attribute unsigned long length;
- getter DOMString key(in unsigned long index);
- getter any getItem(in DOMString key);
- setter creator void setItem(in DOMString key, in any data);
- deleter void removeItem(in DOMString key);
- void clear();
- };
length:返回当前存储在 Storage 对象中的键值对数量。
key(index):返回列表中第 n 个键的名字。Index 从 0 开始。
getItem(key):返回指定键对应的值。
setItem(key, value):存入一个键值对。
removeItem(key) :删除指定的键值对。
clear():删除 Storage 对象中的所有键值对。
通常,使用最多的方法是 getItem 和 setItem。
以 sessionStorage 为例:
存储键值对:
window.sessionStorage.setItem(“key1”, value1);
通过键名来读取值:
var value1 = window.sessionStorage.getItem(“key1”);
判断浏览器是否支持 DOM Storage
要使用 DOM Storage,首先,需要查看当前的浏览器是否支持。目前 Internet Explorer 8.0 以上,Firefox 3.5 以上,Chrome 4.0 以上都是支持 DOM Storage 的。
如果浏览器不支持 DOM Storage,可以用其他的方法作为备选,本文还使用 Dojo 提供的 dojox.storage 模块来实现相同的功能。
清单 1. 查看浏览器是否支持 DOM Storage
- //sessionStorage
- if(window.sessionStorage){
- alert(“support sessionStorage”);
- }else{
- alert(“not support sessionStorage”);
- // 不支持 sessionStorage
- // 用 dojox.storage 来实现相同功能
- }
- //localStorage
- if(window.localStorage){
- alert(“support localStorage”);
- }else{
- alert(“not support localStorage”);
- // 不支持 localStorage
- // 用 dojox.storage 来实现相同功能
- }
下面是用户注册的两个表单。清单 2 中的第一个表单有两个字段 name 和 age 需要用户填写内容。填写完后点击 Next 按钮进入下一个页面,此时函数 saveToStorage 会被调用,把在该页面输入的两个字段的值保存到 sessionStorage 对象中。
当从下一个页面退回到本页面时,使用 windows.onload 在加载页面的时候将数据从 sessionStorage 中取出,并显示在输入框中,方便用户修改。
另外,给对象赋值除了用 setItem 方法外,也可以用 window.sessionStorage.key1 = “value1”。
清单 2. 第一个表单页面
清单 3 的第二个页面有一个 address 字段。当用户填写完毕后,点击 Submit 按钮提交页面,此时 addStorageValue 函数被调用,把保存在 sessionStorage 中的 name 和 age 值先赋给当前表单的两个隐藏字段,随后一起提交给下一个处理表单的页面。最后调用 removeItem 函数删除 name 和 age 值。
如果用户需要修改第一个页面填写的内容,可以点击 Back 按钮回到前一个页面,用户在前一个页面已经填写的内容会出现在 text 框中。
清单 3. 第二个表单页面
#p#
使用 DOM Storage 需要注意的几点
保存在 Storage 对象的数据类型
当使用 DOM Storage 进行本地存储时,任何数据格式在 Storage 对象中都以字符串类型保存,所以如果保存的数据不是字符串,在读取的时候需要自己进行类型的转换。这里我们使用 JSON 将对象序列化之后再存储。
JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写,同时也易于机器解析和生成。目前,JSON 已经是 JavaScript 标准的一部分,主流的浏览器对 JSON 支持都非常完善。
本文用到两个相关的函数
JSON.parse() 函数会把 JSON 对象转换为原来的数据类型。
JSON.stringify() 函数会把要保存的对象转换成 JSON 对象保存。
在清单 4 中,先把一个布尔型的数据存到 Storage 对象中,然后再取出,可以看到布尔类型的数据在取出的时候变为字符串。接下来换一种方式保存数据,先用 JSON.stringify 方法序列化数据,然后保存到 Storage 对象中,在取出的时候用 JSON.parse 方法进行反序列化,可以看到读取出的数据还是布尔类型。
另外,使用 JSON 保存一个字符串,通过 Chrome 的 Storage 工具,可以看到存入的字符串两边有双引号,这个双引号表示存入的是一个字符串。当用 JSON 表示一个简单的字符串时,会在字符串两边加上双引号。最后,该页面加载后的输出如下:
string1 boolean2 string3
清单 4. 使用 JSON 对 DOM Storage 的复杂数据进行处理
- // 生成一个 Boolean 类型的变量 data1
- var data1 = new Boolean(true);
- // 不用 JSON 处理数据
- sessionStorage["key1"] = data1;
- if(sessionStorage["key1"] == "true"){
- // 从 Storage 对象读取出来的数据 data1 变为 String 类型
- document.write("string1 ");
- }
- // 使用 JSON 处理数据 data1
- sessionStorage["key2"] = JSON.stringify(data1);
- if(JSON.parse(sessionStorage["key2"]) == true){
- // 从 Storage 对象读取的数据 data1,用 JSON 将变量转换为原来的 Boolean 类型
- document.write("boolean2 ");
- }
- // 生成一个 String 类型的变量
- var data2 = new String("true");
- // 使用 JSON 处理数据,在 Storage 对象中保存的是 “string”
- sessionStorage["key3"] = JSON.stringify(data2);
- data2 = JSON.parse(sessionStorage["key3"]);
- if(data2 == "true"){
- // 变量转换回来还是 String 类型
- document.write("string3");
- }
使用 Chrome 浏览器可以查看当前的 sessionStorage 和 localStorage 的键值对。在工具栏选择“工具”到“开发人员工具”到“Resources”到“Local Storage”或“Session Storage”, 可以查看 key 和 value。
图 1. Chrome 浏览器的 Storage 工具栏
综上所述,我们可以如清单 5 一样,在加载页面的时候用 JSON 转换数据类型,在离开页面的时候将数据保存为 JSON 对象。这样,保存在 Storage 中任何类型的数据在读取的时候都可以转换为原来的类型。
清单 5. 使用 JSON 对 DOM Storage 的复杂数据进行处理
清单 8. 经过修改后的第二个表单页面的部分代码
结束语
HTML5 中引入了 DOM Storage 机制用于存储键值对,它的设计目的是提供大规模、易用的存储功能,并且程序员可以通过调用标准的接口,简单地访问存储的数据。目前,许多新版本的浏览器都支持 DOM Storage 功能。当老版本的浏览器不支持 HTML5 提供的 DOM Storage 机制时,可以考虑用 Dojo 来实现相同的功能。
下载示例代码
原文:http://www.ibm.com/developerworks/cn/web/1107_gaoly_html5storage/index.html
【编辑推荐】
网站栏目:浅谈HTML5的DOMStorage机制
本文地址:http://www.shufengxianlan.com/qtweb/news13/467563.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联