热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

HTML5本地存储(转)

同样是html5的规范,同样是存储,HTML5本地存储和离线存储不是一回事,感觉有必要提及,因为在互联网铺天盖地宣传html5的特性的时候,经常出现这样那样的字眼,对于还没接触的或初学者来说,很容易混

同样是html5的规范,同样是存储,HTML5本地存储和离线存储不是一回事,感觉有必要提及,因为在互联网铺天盖地宣传html5的特性的时候,经常出现这样那样的字眼,对于还没接触的或初学者来说,很容易混淆这两个概念。离线存储(Offline Storage)正如之前我的那篇介绍中你看到的样子,实际上它实现的是文件的离线存储,而本地存储(Local Storage)跟会话存储(Session Storage)一样同属于web的数据存储(Web Storage)。还有一种存储方式是Web SQL Database,它是一个可以用SQL操作的客户端数据库。这些存储方式都是用户客户端实现的,因此有人会把它们称为“本地存储”,实际上我觉得叫“客户端存储”更合适,这样不至于跟Web Storage中的Local Storage概念冲突和混淆。

什么是HTML5 Local Storage?

HTML5中介绍的Local Storage(有的地方把它叫做DOM Storage)是一种将web数据存储在用户本地的存储方式,这种形式的存储其实你早就接触过了,那就是COOKIE。那么为什么不直接用COOKIE好了,还要本地存储做什么?我们知道,html5带来更丰富的web表现形式,在web中实现大量富媒体应用的时候,对于数据存储的要求也相对提高,当然服务器的压力也相应变大,因此我们需要一种类似于COOKIE的存储方式,但它和COOKIE不大一样:

  1. 我们需要更大的存储空间,本地存储默认有5MB,而COOKIE只能存4k的数据
  2. 和COOKIE一样都存储在客户端的
  3. 数据不会因为页面刷新或关闭等操作而改变
  4. 不会向服务器发出请求,COOKIE是会包含在每个HTTP请求中的

好吧,假设你现在正需要这样的一种存储方式,那么你要知道浏览器的支持情况如何,支持本地存储的浏览器版本有:IE8+,FIREFOX3.5+,SAFARI4+,CHROME4+,OPERA10.5+,IPHONE2+,ANDROID2+以及其他我不知道的。

如何使用HTML5 Local Storage?

不是所有的浏览器都支持html5的本地存储,所以在使用它之前,你需要一点检测工作,来确保你的应用正常运作,你需要下面的代码:

?[Copy to clipboard] View Code Javascript
1
if('localStorage' in window&&window['localStorage'] !== null){/* do storage stuff... */}

Local Storage实现了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();
};

Local Storage是以键值对(key/value)的形式存储的,每个键值对称为一个项(item);length属性返回项的数量;key(n)返回列表中第n个key的名字;getItem和setItem分别是取值和赋值的方法,如果要取值的key不存在返回null,如果赋值的key存在就覆盖,不存在就新建一个项;removeItem可以清除给定的key所对应的项,如果key不存在则什么都不做;clear会清除所有的项,如果列表本来就是空的就什么都不做。请不要忽略这段话的解释,而且要注意“什么都不做”这几个字是有重要作用的,在你需要实现对存储过程的监控的时候尤为重要!你可能会因为做了某个操作却没有触发相应的事件监听器而感到疑惑,原因就在于“什么都不做”。

看完Storage接口后,我们就可以来做实验了,看看如下代码(查看完整Demo):

?[Copy to clipboard] View Code HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37








你好,我好像不认识你





你可能还会看到这样的写法:

?[Copy to clipboard] View Code Javascript
1
localStorage.setItem(1,'some values');

这样不代表该项就是第一项,数字1会被转换为string,因为key的类型就是字符串。

除了接口中那样通过getter跟setter的方式对本地存储的数据进行读写,我们还可以像对象属性访问一样读取与写入数据:

?[Copy to clipboard] View Code Javascript
1
2
localStorage.name='wanz';
localStorage['name']='wanz';

本地存储事件监听

事件监听对于处理存储的异常还是必需的,先来看看StorageEvent 接口的定义:

interface StorageEvent : Event {
readonly attribute DOMString key;
readonly attribute any oldValue;
readonly attribute any newValue;
readonly attribute DOMString url;
readonly attribute Storage storageArea;
void initStorageEvent(in DOMString typeArg, in boolean canBubbleArg, in boolean cancelableArg, in DOMString keyArg, in any oldValueArg, in any newValueArg, in DOMString urlArg, in Storage storageAreaArg);
};

initStorageEvent可以不用管,它负责事件初始化;key返回的是被修改的key;oldValue和newValue分别返回key修改前和修改后的值;url返回修改该key的文档页面地址,有的浏览器可能会叫uri;storageArea返回受影响的Storage对象。

一个简单的存储事件监听的方式可以像下面的代码这样,有经验的同学都知道怎么扩展了,兼容IE不知道的自己google。

?[Copy to clipboard] View Code Javascript
1
addEventListener('storage',ev_handler,false);

不管是setItem(), removeItem()还是 clear()操作,各个存储事件只有在存储内容真正发生变化时才会被触发,这也是之前我强调了“什么都不做”的原因。到目前为止,我用http://www.quirksmode.org/dom/tests/html5_storage.html这个页面测试了IE8,FIREFOX3.6.8,CHROME6.0.496和SAFARI5.0.1发现只有IE8跟FF对事件监听有反应,不过返回的StorageEvent的各个属性值基本都是undefined,而CHROME和SAFARI则没有反应,个人猜测是浏览器对存储事件监听的实现还不完善,不排除代码问题,有兴趣的同学自己做测试,我就不给出DEMO了。

另外,出于浏览器安全限制的考虑,大家在测试代码的时候,一定要在服务器环境下,切记!


推荐阅读
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • 如何在php文件中添加图片?
    本文详细解答了如何在php文件中添加图片的问题,包括插入图片的代码、使用PHPword在载入模板中插入图片的方法,以及使用gd库生成不同类型的图像文件的示例。同时还介绍了如何生成一个正方形文件的步骤。希望对大家有所帮助。 ... [详细]
  • 本文介绍了网页播放视频的三种实现方式,分别是使用html5的video标签、使用flash来播放以及使用object标签。其中,推荐使用html5的video标签来简单播放视频,但有些老的浏览器不支持html5。另外,还可以使用flash来播放视频,需要使用object标签。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了markdown[软件代理设置]相关的知识,希望对你有一定的参考价值。 ... [详细]
  • PHP输出缓冲控制Output Control系列函数详解【PHP】
    后端开发|php教程PHP,输出缓冲,Output,Control后端开发-php教程概述全景网页源码,vscode如何打开c,ubuntu强制解锁,sts启动tomcat慢,sq ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • MyBatis错题分析解析及注意事项
    本文对MyBatis的错题进行了分析和解析,同时介绍了使用MyBatis时需要注意的一些事项,如resultMap的使用、SqlSession和SqlSessionFactory的获取方式、动态SQL中的else元素和when元素的使用、resource属性和url属性的配置方式、typeAliases的使用方法等。同时还指出了在属性名与查询字段名不一致时需要使用resultMap进行结果映射,而不能使用resultType。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • macOS Big Sur全新设计大版本更新,10+个值得关注的新功能
    本文介绍了Apple发布的新一代操作系统macOS Big Sur,该系统采用全新的界面设计,包括图标、应用界面、程序坞和菜单栏等方面的变化。新系统还增加了通知中心、桌面小组件、强化的Safari浏览器以及隐私保护等多项功能。文章指出,macOS Big Sur的设计与iPadOS越来越接近,结合了去年iPadOS对鼠标的完善等功能。 ... [详细]
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • Struts2+Sring+Hibernate简单配置
    2019独角兽企业重金招聘Python工程师标准Struts2SpringHibernate搭建全解!Struts2SpringHibernate是J2EE的最 ... [详细]
  • 本文整理了常用的CSS属性及用法,包括背景属性、边框属性、尺寸属性、可伸缩框属性、字体属性和文本属性等,方便开发者查阅和使用。 ... [详细]
  • CSS|网格-行-结束属性原文:https://www.gee ... [详细]
author-avatar
as16as1
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有