0

0

JavaScript中的本地存储和会话存储

WBOY

WBOY

发布时间:2023-09-06 17:41:09

|

954人浏览过

|

来源于php中文网

原创

javascript中的本地存储和会话存储

假设您正在创建一个网络应用程序,用户可以在其中使用文本或图像等媒体。您希望允许他们编写一些即使在页面刷新或浏览器重新启动后也可以访问的文本。在 Web Storage API 出现之前,您必须将信息存储在后端,并在需要时在客户端重新加载。如果您希望跨浏览器或设备提供信息,这仍然是可行的方法。

但是,如果您希望在页面刷新或浏览器重新启动时保留的信息只能在同一浏览器上访问,那么 Web Storage API 是一个更合适的工具。

有两种类型的Web存储实现,称为localStoragesessionStorage。正如您可能从名称中猜到的那样,sessionStorage 会保留单个会话的信息,而 localStorage 即使在您重新启动浏览器后也会保留您的数据。

在本教程中,您将学习 Web Storage API 的所有基础知识,并且您将了解如何利用本地存储和会话存储来发挥我们的优势。

立即学习Java免费学习笔记(深入)”;

本地存储和会话存储之间的区别

在深入研究 API 之前,我们先了解一下本地存储和会话存储之间的基本区别。

  1. localStorage 即使浏览器重新启动也不会过期,而 sessionStorage 仅持续到页面刷新。
  2. localStorage 在具有相同来源的多个选项卡和窗口之间共享。另一方面,对于加载相同网页的每个选项卡,sessionStorage 将有所不同。

单个网页或文档可以拥有自己的 localStoragesessionStorage 对象。但是,它们将相互独立。

可用的 Web 存储方法和属性

localStoragesessionStorage 有五种可用方法。

您可以使用 setItem(key, value) 方法将一些信息以键/值对的形式存储在存储对象中。如果键已经存在,此方法将更新其值。请记住,此方法要求键和值都是字符串。

您可以使用 getItem(key) 方法来检索为特定密钥存储的信息。如果传递的密钥不存在,该方法将返回 null

假设您要从 localStoragesessionStorage 中删除一些信息。在这种情况下,您可以使用 removeItem(key) 方法并传递相关的键名称,以便从存储中删除键及其值。

您还可以使用 clear() 方法一次清除所有密钥,而不是一次从存储中删除一个密钥。

还有一个 key(index) 方法,它接受一个整数作为键索引,并返回该特定索引处的键名称。这里要记住的重要一点是键的顺序是由用户代理定义的。

最后,有一个 length 属性,您可以使用它来获取存储在给定存储对象中的数据项的数量。

您可以将 length 属性与 key() 方法和 getItem() 方法结合使用来访问 localStoragesessionStorage 中所有键的值。

以下是使用所有这些方法的一些示例:

Metafox企业内容管理系统0.9.1
Metafox企业内容管理系统0.9.1

Metafox 是一个企业内容管理系统,使用一个特别的模板系统,你可通过一些特定的设计和代码来轻松创建 Web 网站,内容存储在 SQL 关系数据库,通过 Web 进行管理,简单、快速而且高效。 Metafox 0.9.1 发布,该版本改用一种更棒的 URL 风格,实现了 RSS 源(可包含远端网站内容到 Metafox 段中),重定向老的访问密钥到新的密钥,增加 RotateAntispam 技

下载
/* Save some key-value pairs */
localStorage.setItem("artist", "Monty Shokeen");
localStorage.setItem("website", "tutsplus.com");
localStorage.setItem("font", "Righteous");
localStorage.setItem("stroke_width", "4");
localStorage.setItem("color", "#FF5722");

/* Access stored values */
console.log(localStorage.getItem("color"));
// Outputs: #FF5722

console.log(localStorage.getItem("stroke_width"));
// Outputs: 4

/* Iterate over keys */
for (let i = 0; i < localStorage.length; i++) {
  console.log(`${localStorage.key(i)} : ${localStorage.getItem(localStorage.key(i))}`);
}
/*
stroke_width : 4
font : Righteous
website : tutsplus.com
color : #FF5722
artist : Monty Shokeen
*/

/* Removing keys from storage */
localStorage.removeItem("website"); 
localStorage.getItem("website"); 
// Outputs: null

本地存储的实际应用

让我们用我们所获得的所有知识来做一些实际的事情。我们将创建一个简单的绘图应用程序,用户可以将数据保存在本地存储中以供将来检索。

我们的绘图应用程序将非常简单。我们将有一个画布,用户可以在其中绘制随机半径的同心圆。半径的最小值和最大值将由它们填充的输入字段确定。一旦我们绘制了太多圆圈,我们还将有一个按钮来清除画布。这是我们的标记:




我们将在本地存储中存储三项信息:最小半径、最大半径和画布的状态。请记住,本地存储只能将信息存储为字符串。输入字段的值可以自动转换为字符串。但是,我们需要使用 toDataURL() 方法以字符串形式获取画布的状态。此方法将返回一个包含所请求数据 URL 的字符串。

我们将向网页上的所有元素附加事件侦听器:画布的 mousedown 事件侦听器、输入元素的 change 事件侦听器以及按钮的 click 事件侦听器。让我们从表单字段的一些初始化代码和事件侦听器开始。

const canvas = document.getElementById("canvas");
const ctx = canvas.getContext("2d");

const minElem = document.querySelector("input#min-rad");
const maxElem = document.querySelector("input#max-rad");
const clearBtn = document.querySelector("button#clear");

let min_radius = 10;
let max_radius = 30;

minElem.addEventListener("change", function(event) {
  min_radius = parseInt(event.target.value);
  localStorage.setItem("min-radius", min_radius);
});

maxElem.addEventListener("change", function(event) {
  max_radius = parseInt(event.target.value);
  localStorage.setItem("max-radius", max_radius);
});

clearBtn.addEventListener("click", function(event) {
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  
  let image_data = canvas.toDataURL();
  localStorage.setItem("image-data", image_data);
});

默认情况下,我们将最小和最大半径值分别设置为 10 和 30 像素。最小和最大半径输入字段的更改事件侦听器将解析输入的值,然后将这些值存储在本地存储中。

在按钮的单击事件侦听器回调中,我们首先清除画布,然后使用 toDataUrl() 方法将此清除状态保存到本地存储。

这是在画布上侦听 mousedown 事件的代码。

canvas.addEventListener('mousedown', function(event) {
    const canvas_rect = event.target.getBoundingClientRect();
    const pos_x = event.clientX - canvas_rect.left;
    const pos_y = event.clientY - canvas_rect.top;
  
    for(let i = 0; i < 10; i++) {
      let radius = min_radius + Math.floor(Math.random()*(max_radius - min_radius));
      ctx.beginPath();
      ctx.arc(pos_x, pos_y, radius, 0, 2 * Math.PI);
      ctx.stroke();
    }
  
    let image_data = canvas.toDataURL();
    localStorage.setItem("image-data", image_data);
});

让我们来分解一下。我们首先计算用户在画布上单击的确切位置。这是通过从单击位置的 x 坐标减去画布边界矩形的 left 属性的值来确定的。我们做同样的事情来获取点击的垂直位置。

之后,我们创建一个 for 循环,在画布上绘制十个同心圆。半径设置为受最小和最大约束的随机值。最后,就像按钮的点击监听器一样,我们将画布状态保存在本地存储中。每次点击都会发生这种情况,以便我们能够及时了解最新的画布状态。

现在我们唯一要做的就是从本地存储中恢复值以供重新加载或重新启动时使用。我们使用以下代码来完成此操作:

window.addEventListener("DOMContentLoaded", (event) => {
  if (localStorage.getItem("image-data")) {
    var img = new Image();
    img.onload = function () {
      ctx.drawImage(img, 0, 0);
    };
    img.src = localStorage.getItem("image-data");
  }

  if (localStorage.getItem("min-radius")) {
    min_radius = parseInt(localStorage.getItem("min-radius"));
  }

  if (localStorage.getItem("max-radius")) {
    max_radius = parseInt(localStorage.getItem("max-radius"));
  }

  minElem.value = min_radius;
  maxElem.value = max_radius;
});

这里最复杂的部分是将图像数据从本地存储恢复到画布。为此,我们首先创建 HTMLImageElement 的新实例,然后侦听其 onload 事件,以便在画布上绘制加载的图像。

以下 CodePen 演示将向您展示我们的绘图应用程序的实际运行情况。首先尝试单击画布绘制一些圆圈或将半径设置为您喜欢的值。

现在,我们在教程中使用localStorage,这意味着即使浏览器重新启动我们的数据也将是安全的。您可以尝试将其替换为 sessionStorage 以仅在页面刷新期间保留信息。

最终想法

在本教程中,我们介绍了 JavaScript 中 localStoragesessionStorage 的基础知识。您现在应该能够使用 Web Storage API 在浏览器存储中存储和检索信息。正如我们在此处创建绘图应用程序时看到的那样,该 API 有很多应用程序。您还可以使用它在本地文本编辑器中实现内容保存功能。

相关文章

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

37

2026.01.14

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

19

2026.01.13

PHP 高性能
PHP 高性能

本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

37

2026.01.13

MySQL数据库报错常见问题及解决方法大全
MySQL数据库报错常见问题及解决方法大全

本专题整合了MySQL数据库报错常见问题及解决方法,阅读专题下面的文章了解更多详细内容。

19

2026.01.13

PHP 文件上传
PHP 文件上传

本专题整合了PHP实现文件上传相关教程,阅读专题下面的文章了解更多详细内容。

16

2026.01.13

PHP缓存策略教程大全
PHP缓存策略教程大全

本专题整合了PHP缓存相关教程,阅读专题下面的文章了解更多详细内容。

6

2026.01.13

jQuery 正则表达式相关教程
jQuery 正则表达式相关教程

本专题整合了jQuery正则表达式相关教程大全,阅读专题下面的文章了解更多详细内容。

3

2026.01.13

交互式图表和动态图表教程汇总
交互式图表和动态图表教程汇总

本专题整合了交互式图表和动态图表的相关内容,阅读专题下面的文章了解更多详细内容。

45

2026.01.13

nginx配置文件详细教程
nginx配置文件详细教程

本专题整合了nginx配置文件相关教程详细汇总,阅读专题下面的文章了解更多详细内容。

9

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 3.6万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 2.2万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 2.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号