Web数据存储之localStorage和sessionStorage

Web数据存储之localStorage和sessionStorage

学习前端以来,自己了解有localStorage和sessionStorage的相关存储的知识,也有实践过,但是之前只限于能用的基础上,但最近看了一本书,深入了解了localStorage和sessionStorage,才意识到自己了解太表面,于是想借此总结一下。

1.Web存储简介

Web存储分为两种,分别对应两个JavaScript对象:

  • 本地存储:对应localStorage对象,用于长期保存网站的数据,并且站内任何页面都可以访问该数据。也就是说,如果有一个网页利用本地存储保存了数据,那么访客在一天后、一星期后,甚至一年之后再上线,该数据仍然还会在那儿。
  • 会话存储:对应sessionStorage对象,用于临时保存针对一个窗口(或标签页)的数据。在访客关闭窗口或标签页之前,这些对象是存在的,而关闭之后就会被浏览器删除。不过,只要用户不关闭窗口或标签页,就算他从你的网站跑到别人的网站然后又回来,这些数据还是会存在的。

    区别:从页面代码的角度说,本地存储和会话存储的操作完全相同。它们的区别仅在于数据的寿命。本地存储主要用于保存访客将来还能看到的数据,而会话存储则用于保存那些需要从一个页面传递到下一个页面的数据。

注意:

  • 无论是本地存储还是会话存储,都是与网站所在的域联系在一起的
  • 由于数据保存在用户的计算机上(或移动设备上),这些数据也是跟计算机绑定的;页面不能访问保存在其他计算机上的数据。类似的,如果你用不同的用户名登录自己的电脑,或者使用不同的浏览器,那么存取的也将是不同的本地存储数据。

    尽管HTML5没有硬性规定存储空间的上限,但大多数浏览器都把本地存储限制为5MB以下

2.存储数据

要把一段信息保存到本地存储或会话存储中,首先要为该信息想一个合适的名字。这个名字叫作键,将来要通过它来取回数据。

1.保存数据

要保存数据,需使用localStorage.setItem()方法:

localStorage.setItem(keyName, data);

如下所示,保存用户名,那么这个键就可以叫作user_name;

localStorage.setItem("user_name", "xingxi");

当然,像这样保存硬编码的数据没有多大意思。更多的情况下,可以保存动态数据,比如当前日期、数据计算的结果等,或者用户在文本框中输入的某些文本,等等。如:

//取得文本框
var nameInput = document.getElementById("userName");
//保存文本框中的文本
localStorage.setItem("user_name", nameInput.value);

2.读取数据
读取本地存储中是数据跟保存数据一样简单,只需要使用localStorage.getItem()方法。

//读取用户名
localStorage.getItem("user_name");

无论这个名字是5秒前保存的,还是5个月前保存的,这行代码都管用。

当然,有可能这个键下面尚未保存任何数据。要检测某个键是否为空,可以直接测试它是否等于null。如:

if(localStorage.getItem("user_name") == null) {alert("不存在这样的名字哦。")
}else {//将用户名放到文本框中document.getElementById("userName").value = localStorage.getItem("user_name");
}

会话存储也一样简单。唯一的区别是使用sessionStorage对象,而不是使用localStorage对象。

Web存储还支持两种读写数据的语法,除了使用getItem()和setItem(),还可以使用属性名或索引方式。

  • 属性名:localStorage.user_name;
  • 索引方式: localStorage[“user_name”]

注意:没有web服务器则不能使用web存储:在很多浏览器中,只有web服务器上打开的页面才能读写web存储。无论这个web服务器是远程的还是本地的–关键就是不能从本地硬盘上打开页面。这个问题的根源就在于浏览器要限制web存储的空间大小。

3.浏览器对Web存储的支持情况

Web存储是现代浏览器支持情况最好的HTML5功能之一。在不支持Web存储的可能就只有IE7了。如果要兼容IE7,可以使用cookie来模拟Web存储。虽然不完美,但是可行。

4.深入Web存储

前面已经介绍过关于Web存储的基础知识,接下来会介绍从Web存储中删除数据项,检索当前保存的所有数据,以及处理不同的数据类型、保存自定义对象和响应存储数据变化。

4.1 删除数据项

这个任务只要调用removeItem()方法,传入键名,即可删除不想要的数据。

localStorage.removeItem("user_name");

或者调用clear()方法,清空网站在本地保存的会话数据。

sessionStorage.clear();

4.2 查找所有数据项

使用key()方法从本地或会话存储中取得(当前网站保存的)所有数据项。

localStorage.key();  //可以取出所有数据项

4.3 保存数值和日期

到目前为止,我们还遗漏了关于web存储的一个重要细节:在通过localStorage和sessionStorage保存数据时,该数据会自动被转换为本文字符串。对于本来就是文本的数据,这当然没有问题,但数值就不一样了。

//oldX=5 为数值
newX = localStorage.getItem("oldX");
newX += 5;  //结果会变成‘55’

这里因为newX为字符串,javascript把5转化为字符串了,实际运行的是’5’+ ‘5’,结果为55,而不是10。这里的解决办法是需要给javascipt一个提示,告诉它你想计算两个数值的加法。办法如下:

newX = Number(localStorage.getItem("oldX"));

保存日期也是同样的道理,结果并不会保存日期对象,而是会保存一个文本字符串。可是要将文本字符串转回日期对象可不容易。为了解决这个问题,可以采用如下的方法:

//创建日期对象
var today = new Date();//按照YYYY/MM/DD的标准格式把日期转换成文本字符串
var todayString = today.getFullYear() + "/" + today.getMonth() + "/" + today.getDate();
sessionStorage.setItem("session_started", todayString);
...
//取得日期文本,并基于该文本创建的日期对象,因为文本格式是有效的日期形式
today = new Date(sessionStorage.getItem("session_started"));

4.4 保存对象

为了把自定义对象保存到Web存储中,必须先把对象转换为文本形式。JSON是把结构化数据(类似封装在对象中的那些值)转化为文本的一种简便格式。
直接调用JSON.stringify()就可以把任何对象连同其数据转换为文本形式。调用JSON.parse()则可以把文本转换回对象。

var params = {name: xingxi,age: 20
}
//将数据保存为JSON格式
sessionStorage.setItem("message", JSON.stringify(params));
//JSON文本转换为原来的对象
JSON.parse(sessionStorage.getItem(message));

4.5 响应存储变化

Web存储为我们提供了在不同浏览器窗口间通信的机制。具体来说,就是在本地存储或会话存储发生变化时,其他查看同一页面或同一站点中其他页面的窗口就会触发window.onStorage事件。
所谓存储变化,指的就是向存储中添加新数据项,修改既有数据项,删除数据项或清除所有数据。但是,那些对存储不产生任何影响的操作(如用既有的键名保存相同的值,或者清除原本就是空的存储空间),不会引发onStorage事件

通过认真深入的学习这一块的知识,现在对Web存储有了比较深入的了解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/249656.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(四)RabbitMQ消息队列-服务详细配置与日常监控管理

(四)RabbitMQ消息队列-服务详细配置与日常监控管理 原文:(四)RabbitMQ消息队列-服务详细配置与日常监控管理RabbitMQ服务管理 启动服务:rabbitmq-server -detached【 /usr/local/rabbitmq/sbin/rabbitmq-server -deta…

oracle中delete、truncate、drop的区别 (转载)

一、delete 1、delete是DML,执行delete操作时,每次从表中删除一行,并且同时将该行的的删除操作记录在redo和undo表空间中以便进行回滚(rollback)和重做操作,但要注意表空间要足够大,需要手动提交…

前端开发工程化探讨--基础篇(长文)

转载自UC资深前端工程师张云龙的github 喂喂喂,那个切图的,把页面写好就发给研发工程师套模板吧。 你好,切图仔。 不知道你的团队如何定义前端开发,据我所知,时至今日仍然有很多团队会把前端开发归类为产品或者设计岗…

Python读取Json字典写入Excel表格的方法

需求: 因需要将一json文件中大量的信息填入一固定格式的Excel表格,单纯的复制粘贴肯定也能完成,但是想偷懒一下,于是借助Python解决问题。 环境: Windows7 Python2.7 Xlwt 具体分析: 原始文件为json列表&am…

Spring-BeanFactory源码分析

正式进入Spring 源码分析这个模块了,对于spring这个庞大的工程,如果要一点点的完全分析是非常困难的,对于应用型框架,我还是偏向于掌握思想或者设计,而不是记住代码,对于初次看spring源码,相信大…

Linux查看修改时间、时区

同步网络时间 yum install ntpntpdate time.nist.gov timedatectl set-timezone Asia/Shanghai如果上面time.nist.gov服务器同步不了,可以换下面几个时间服务器试试:time.nist.govtime.nuri.net0.asia.pool.ntp.org1.asia.pool.ntp.org2.asia.pool.ntp.o…

我所知道的HTTP和HTTPS

摘要:相比之前的传输协议,HTTP/2在底层方面做了很多优化。有安全、省时、简化开发、更好的适应复杂页面、提供缓存利用率等优势,阿里云早在去年发布的CDN6.0服务就已正式支持HTTP/2,访问速度最高可提升68%。 写在前面 超文本传输…

sql server常用性能计数器

https://blog.csdn.net/kk185800961/article/details/52462913?utm_sourceblogxgwz5 https://blog.csdn.net/kk185800961/article/details/27657239 以下部分转自:http://www.cnblogs.com/zhijianliutang/p/4174697.html 常规计数器 收集操作系统服务器的服务器性能…

Python中正反斜杠('/'和'\')的意义

刚刚在学习些测试报告的时候,出现一个路径的问题,找了很久的原因,竟然是少了一个反斜杠引起的,在此顺便记录一下正反斜杠的作用。 在Python中,记录路径时有以下几种写法,如:(大家都知…

什么是IOC容器

1.IOC不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合,更优良的程序。传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试&#x…

Jenkins配置与使用

Jenkins是一个开源软件项目,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。Jenkins是基于Java开发的一种持续集成工具,用于监控持续重复的工作,功能包括:1、持续的软件版本发布/测试项目。2、监控外部调用…

fastDFS使用

fastDFS : 分布式文件系统C语言开发,fastDFS为互联网量身定制,考虑到了冗余备份,负载均衡,线性扩容...很容易搭建集群文件存储系统.存储在fastDFS图片:相当于存储在本地磁盘一样访问图片:相当于访问本地磁盘存储结构:组名/虚拟磁盘路径/动态生成文件名.扩展名192.168.100.20/gr…

本地环境用eclipse搭建spring源码环境

对于JAVA和.NET开发人员来讲Spring框架并不陌生,对于想进行spring源码学习的同学来讲,在本地下载和构建spring项目很有必要。以下简要说明下Spring源码的下载和在eclipse下的构建方式。 工具/原料 JDK Eclipse 我们需要从源码库下载Spring的源码文件到本…

SpringToolsSuite (STS)或Eclipse安装gradle

对于新手刚进入职场,不知怎么在Spring Tools Suite (STS)或Eclipse上安装gradle,因为该项目自动化构建开源工具在一些企业中是要用的。本经验介绍如何安装。 工具/原料 Spring Tools Suite (STS)或Eclipse开发工具 gradle-5.0-all.zip压缩包 下载Gradle…

[NOI2007]货币兑换

题目 先来画一画柿子 设\(dp_i\)表示你第\(i\)天之后最多剩下多少钱 考虑一下对于\(i\)的转移,我们肯定要在之前枚举一天\(j\)这一天把所有的东西买进来,之后在\(i\)天卖掉 设那天买进\(A\)的量为\(d_a\),买进\(B\)的量为\(d_b\) 我们可以得到…

spring-beans模块分析

描述:spring-beans负责实现Spring框架的IOC模块 UML结构图如下: AbstractBeanFactory:BeanFactory接口的抽象实现类,提供了ConfigurableBeanFactory 完整SPI。 通过DefaultSingletonBeanRegistry实现了单例缓存(singleton cache). 实现了通过…

spark-streaming first insight

一、 Spark Streaming 构建在Spark core API之上,具备可伸缩,高吞吐,可容错的流处理模块。 1)支持多种数据源,如Kafka,Flume,Socket,文件等; Basic sources: Sources dir…

DHCP服务器 出现的故障

系统版本:Windows Server 2008 R2 Standard 故障现象:近段时间,我们核心网络DHCP服务器,总是发现有掉线重起现象,大约每10分钟至30分钟不定时会重起。 故障代码:关键系统进程 C:\Windows\system32\lsass.ex…

双亲委派

双亲委派模式的工作原理的是:如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行,如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到…

程序设计入门-C语言基础知识-翁恺-第六周:数组-详细笔记(六)

目录 第六章:数组6-1 数组6-2 数组计算6.3 课后习题第六章:数组 6-1 数组 题目:让用户输入一组整数以-1结束输入,算出这组数的平均值,并且输出大于平均值的数。 我们需要记录用户所有输入的数字才能在判断出平均值后输…