当前位置: 首页 > news >正文

使用Web Storage API实现客户端数据持久化

💓 博客主页:瑕疵的CSDN主页
📝 Gitee主页:瑕疵的gitee主页
⏩ 文章专栏:《热点资讯》

使用Web Storage API实现客户端数据持久化

使用Web Storage API实现客户端数据持久化

  • 使用Web Storage API实现客户端数据持久化
    • 引言
    • Web Storage API 的基本概念
      • 什么是Web Storage API
      • Web Storage API 的两种存储方式
      • Web Storage API 的核心特性
    • Web Storage API 的使用方法
      • 1. 存储数据
        • localStorage
        • sessionStorage
      • 2. 获取数据
      • 3. 删除数据
      • 4. 监听存储事件
    • 实际案例:使用Web Storage API实现用户偏好设置
      • 1. 创建HTML结构
      • 2. 编写JavaScript代码
      • 3. 测试应用
    • 最佳实践
      • 1. 数据类型
      • 2. 安全性
      • 3. 容量限制
      • 4. 同源策略
      • 5. 浏览器兼容性
    • 结论
    • 参考资料

引言

在现代Web开发中,客户端数据持久化是一个重要的需求。Web Storage API 提供了一种简单且高效的方式来存储客户端数据,而无需依赖服务器。本文将详细介绍 Web Storage API 的基本概念、核心特性、使用方法以及一个实际的示例应用。

Web Storage API 的基本概念

什么是Web Storage API

Web Storage API 是一组浏览器提供的接口,允许开发者在客户端存储数据。与传统的 Cookie 相比,Web Storage API 提供了更大的存储容量和更好的性能。

Web Storage API 的两种存储方式

  1. localStorage:持久性存储,数据不会因浏览器关闭而丢失。
  2. sessionStorage:会话存储,数据在浏览器标签页关闭后会被清除。

Web Storage API 的核心特性

  1. 大容量:localStorage 和 sessionStorage 分别提供了 5MB 和 5MB 的存储空间。
  2. 简单易用:API 简单直观,易于上手。
  3. 同步操作:所有操作都是同步的,不会影响页面性能。
  4. 同源策略:数据只能在同一源(协议、域名、端口)下访问。

Web Storage API 的使用方法

1. 存储数据

localStorage
// 存储单个键值对
localStorage.setItem('key', 'value');// 存储多个键值对
localStorage.setItem('name', 'Alice');
localStorage.setItem('age', '25');
sessionStorage
// 存储单个键值对
sessionStorage.setItem('key', 'value');// 存储多个键值对
sessionStorage.setItem('name', 'Alice');
sessionStorage.setItem('age', '25');

2. 获取数据

// 从 localStorage 获取数据
const name = localStorage.getItem('name');
const age = localStorage.getItem('age');// 从 sessionStorage 获取数据
const name = sessionStorage.getItem('name');
const age = sessionStorage.getItem('age');

3. 删除数据

// 从 localStorage 删除单个键值对
localStorage.removeItem('name');// 从 localStorage 清除所有数据
localStorage.clear();// 从 sessionStorage 删除单个键值对
sessionStorage.removeItem('name');// 从 sessionStorage 清除所有数据
sessionStorage.clear();

4. 监听存储事件

当同一个源的其他窗口或标签页中的数据发生变化时,会触发 storage 事件。

window.addEventListener('storage', (event) => {console.log('Key changed:', event.key);console.log('Old value:', event.oldValue);console.log('New value:', event.newValue);console.log('URL:', event.url);
});

图示:Web Storage API的核心特性及其在客户端数据持久化中的应用

实际案例:使用Web Storage API实现用户偏好设置

假设我们要实现一个简单的用户偏好设置功能,用户可以选择主题颜色并保存在本地存储中。以下是具体的步骤和代码示例:

1. 创建HTML结构

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>User Preferences</title><style>body {transition: background-color 0.3s ease;}</style>
</head>
<body><h1>User Preferences</h1><label for="theme">Choose a theme:</label><select id="theme"><option value="light">Light</option><option value="dark">Dark</option></select><script src="app.js"></script>
</body>
</html>

2. 编写JavaScript代码

app.js 文件中编写 JavaScript 代码,实现用户偏好设置的保存和加载。

// 获取选择框元素
const themeSelect = document.getElementById('theme');// 加载用户偏好设置
function loadPreferences() {const savedTheme = localStorage.getItem('theme');if (savedTheme) {themeSelect.value = savedTheme;applyTheme(savedTheme);}
}// 应用主题
function applyTheme(theme) {if (theme === 'dark') {document.body.style.backgroundColor = '#333';document.body.style.color = '#fff';} else {document.body.style.backgroundColor = '#fff';document.body.style.color = '#333';}
}// 保存用户偏好设置
function savePreferences() {const selectedTheme = themeSelect.value;localStorage.setItem('theme', selectedTheme);applyTheme(selectedTheme);
}// 监听选择框的变化
themeSelect.addEventListener('change', savePreferences);// 初始化加载偏好设置
loadPreferences();

3. 测试应用

  1. 打开浏览器,访问包含上述 HTML 和 JavaScript 代码的页面。
  2. 选择一个主题颜色,观察页面背景色和文字颜色的变化。
  3. 关闭浏览器标签页,重新打开页面,观察保存的主题设置是否仍然生效。

图示:使用Web Storage API实现用户偏好设置的具体步骤

最佳实践

1. 数据类型

Web Storage API 只支持存储字符串类型的数据。如果需要存储复杂数据类型(如对象或数组),可以使用 JSON.stringifyJSON.parse 进行转换。

// 存储对象
const user = { name: 'Alice', age: 25 };
localStorage.setItem('user', JSON.stringify(user));// 获取对象
const storedUser = JSON.parse(localStorage.getItem('user'));
console.log(storedUser); // { name: 'Alice', age: 25 }

2. 安全性

虽然 Web Storage API 提供了方便的客户端数据存储功能,但也需要注意安全性。避免存储敏感信息,如密码和信用卡号。

3. 容量限制

Web Storage API 的存储容量有限,不要存储大量数据。如果需要存储大量数据,可以考虑使用 IndexedDB。

4. 同源策略

Web Storage API 遵循同源策略,确保数据只能在同一源(协议、域名、端口)下访问。

5. 浏览器兼容性

Web Storage API 在现代浏览器中得到了广泛支持,但在一些老旧浏览器中可能不可用。可以使用 typeof localStorage !== 'undefined' 进行兼容性检测。

if (typeof localStorage !== 'undefined') {// 使用 Web Storage API
} else {// 使用其他存储方式
}

结论

Web Storage API 是一种简单且高效的客户端数据持久化解决方案。通过 localStoragesessionStorage,开发者可以轻松地在客户端存储和管理数据。本文详细介绍了 Web Storage API 的基本概念、核心特性、使用方法以及一个实际的示例应用。希望本文能帮助读者更好地理解和使用 Web Storage API,构建高质量的 Web 应用。

参考资料

  • MDN Web Docs: Web Storage API
  • MDN Web Docs: localStorage
  • MDN Web Docs: sessionStorage
  • W3Schools: Web Storage

相关文章:

使用Web Storage API实现客户端数据持久化

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Web Storage API实现客户端数据持久化 使用Web Storage API实现客户端数据持久化 使用Web Storage API实现客户端数据持久化…...

基于STM32F103的秒表设计-液晶显示

基于STM32F103的秒表设计-液晶显示 仿真软件: Proteus 8.17 编程软件: Keil 5 仿真实现: 在液晶1602上进行秒表显示,每100ms改变一次数值,一共三个按键,分为启动按键、暂停按键、复位按键。 电路介绍: 前面章节里已经和大家介绍了使用数码管设计的秒表,本次仿真将数…...

ReentrantLock的具体实现细节是什么

在 JDK 1.5 之前共享对象的协调机制只有 synchronized 和 volatile,在 JDK 1.5 中增加了新的机制 ReentrantLock,该机制的诞生并不是为了替代 synchronized,而是在 synchronized 不适用的情况下,提供一种可以选择的高级功能。 在 Java 中每个对象都隐式包含一个 monitor(监…...

【JavaScript】this 指向

1、this 指向谁 多数情况下&#xff0c;this 指向调用它所在方法的那个对象。即谁调的函数&#xff0c;this 就归谁。 当调用方法没有明确对象时&#xff0c;this 就指向全局对象。在浏览器中&#xff0c;指向 window&#xff1b;在 Node 中&#xff0c;指向 Global。&#x…...

DB Type

P位 p 1时段描述符有效&#xff0c;p 0时段描述符无效 Base Base被分成了三个部分&#xff0c;按照实际拼接即可 G位 如果G 0 说明描述符中Limit的单位是字节&#xff0c;如果是G 1 &#xff0c;那么limit的描述的单位是页也就是4kb S位 S 1 表示代码段或者数据段描…...

python-返回函数

Python的函数不但可以返回int、str、list、dict等数据类型&#xff0c;还可以返回函数&#xff01; 例如&#xff0c;定义一个函数 f&#xff08;&#xff09;&#xff0c;我们让它返回一个函数 g&#xff0c;可以这样写&#xff1a; def f&#xff08;&#xff09;&#xff…...

python语言基础-5 进阶语法-5.2 装饰器-5.2.1 闭包

声明&#xff1a;本内容非盈利性质&#xff0c;也不支持任何组织或个人将其用作盈利用途。本内容来源于参考书或网站&#xff0c;会尽量附上原文链接&#xff0c;并鼓励大家看原文。侵删。 5.2 装饰器 python中的装饰器相当于java中的注解。装饰器用于为函数添加某些修饰性、…...

用vscode编写verilog时,如何有信号定义提示、信号定义跳转(go to definition)、模块跳转(跨文件跳转)这些功能

&#xff08;一&#xff09;方法一&#xff1a;安装插件SystemVerilog - Language Support 安装一个vscode插件即可&#xff0c;插件叫SystemVerilog - Language Support。虽然说另一个插件“Verilog-HDL/SystemVerilog/Bluespec SystemVerilog”也有信号提示及定义跳转功能&am…...

MQTT+Springboot整合

1.mqttconfig配置(配置参数是从数据库查出来的) package com.terminal.dc3.api.center.manager.config;import com.collection.common.utils.StringUtils; import com.collection.system.mapper.MqttConfigMapper; import lombok.Data; import org.springframework.beans.fact…...

ERROR TypeError: AutoImport is not a function

TypeError: AutoImport is not a function 原因&#xff1a;unplugin-auto-import 插件版本问题 Vue3基于Webpack&#xff0c;在vue.config.js中配置 当unplugin-vue-components版本小于0.26.0时&#xff0c;使用以下写法 const { defineConfig } require("vue/cli-se…...

软考教材重点内容 信息安全工程师 第 3 章 密码学基本理论

&#xff08;本章相对老版本极大的简化&#xff0c;所有与算法相关的计算全部删除&#xff0c;因此考试需要了解各个常 用算法的基本参数以及考试中可能存在的古典密码算法的计算&#xff0c;典型的例子是 2021 和 2022 年分别考了 DES 算法中的 S 盒计算&#xff0c;RSA 中的已…...

微信小程序 https://thirdwx.qlogo.cn 不在以下 downloadFile 合法域名列表中

授权登录后&#xff0c;拿到用户头像进行加载&#xff0c;但报错提示&#xff1a; https://thirdwx.qlogo.cn 不在以下 downloadFile 合法域名列表中 解决方法一&#xff08;未完全解决&#xff0c;临时处理&#xff09;&#xff1a;在微信开发者工具将不校验...勾上就可以访问…...

Linux性能优化之火焰图的起源

Linux火焰图的起源与性能优化专家 Brendan Gregg 密切相关&#xff0c;他在 2011 年首次提出这一工具&#xff0c;用于解决性能分析过程中可视化和数据解读的难题。 1. 背景&#xff1a;性能优化的需求 在现代计算中&#xff0c;性能优化往往需要对程序执行中的热点和瓶颈进行…...

《Markdown语法入门》

文章目录 《Markdown语法入门》1.标题2.段落2.1 换行2.2分割线 3.文字显示3.1 字体3.2 上下标 4. 列表4.1无序列表4.2 有序列表4.3 任务列表 5. 区块显示6. 代码显示6.1 行内代码6.2 代码块 7.插入超链接8.插入图片9. 插入表格 《Markdown语法入门》 【Typora 教程】手把手教你…...

Controller Baseband commands速览

目录 一、设备连接与通信控制类&#xff08;34条&#xff09; 1.1. 连接参数相关 1.1.1. 连接建立超时设置 1.1.2. 链路监督超时设置 1.1.3. Page操作超时设置 1.1.4. 扩展Page操作超时设置 1.1.5. 安全连接主机支持 1.2. 扫描操作相关 1.2.1. 扫描启用与禁用 1.2.2.…...

Redisson 3.39.0 发布

Redisson 3.39.0 发布&#xff0c;官方推荐的 Redis 客户端 Redisson 3.38.0 &#xff0c;一个 Java 编写的 Redis 客户端。 此版本更新内容如下&#xff1a; RTopic 对象的 partitioning 实现 RShardedTopic对象的 partitioning 实现 RReliableTopic 对象的 partitioning 实…...

高阶C语言补充:柔性数组

C99中&#xff0c;结构体中最后一个元素允许时未知大小的数组&#xff0c;这就叫做柔性数组成员。 vs编译器也支持柔性数组。 之所以把柔性数组单独列出&#xff0c;是因为&#xff1a; 1、柔性数组是建立在结构体的基础上的。 2、柔性数组的使用用到了动态内存分配。 这使得柔…...

S32K324信息安全-使用IC5000/IC5700进行debug口解锁

文章目录 前言winIDEA配置参考 前言 由于信息安全要求&#xff0c;需要对debug口&#xff08;JTAG&#xff09;进行加密&#xff0c;本文介绍基于固定密码的方式&#xff0c;使用IC5000/IC5700进行debug口解锁的方法 winIDEA配置 点击 Hardware | CPU Options | Reset | Ini…...

简单实现QT对象的[json]序列化与反序列化

简单实现QT对象的[json]序列化与反序列化 简介应用场景qt元对象系统思路实现使用方式题外话 简介 众所周知json作为一种轻量级的数据交换格式&#xff0c;在开发中被广泛应用。因此如何方便的将对象数据转为json格式和从json格式中加载数据到对象中就变得尤为重要。 在python类…...

Unity肢体控制(关节控制)

前面的基础搭建网上自己搜&#xff0c;我这个任务模型网上也有&#xff0c;可以去官网看看更多模型&#xff0c;这里只讲述有模型如何驱动肢体的操作方式 第一步&#xff1a;创建脚本 第二步&#xff1a;创建Rig Builder 建空容器 加部件&#xff08;Rig&#xff09;,加了之后…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

作为测试我们应该关注redis哪些方面

1、功能测试 数据结构操作&#xff1a;验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化&#xff1a;测试aof和aof持久化机制&#xff0c;确保数据在开启后正确恢复。 事务&#xff1a;检查事务的原子性和回滚机制。 发布订阅&#xff1a;确保消息正确传递。 2、性…...

tomcat指定使用的jdk版本

说明 有时候需要对tomcat配置指定的jdk版本号&#xff0c;此时&#xff0c;我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...

Oracle11g安装包

Oracle 11g安装包 适用于windows系统&#xff0c;64位 下载路径 oracle 11g 安装包...

nnUNet V2修改网络——暴力替换网络为UNet++

更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...

机器学习的数学基础:线性模型

线性模型 线性模型的基本形式为&#xff1a; f ( x ) ω T x b f\left(\boldsymbol{x}\right)\boldsymbol{\omega}^\text{T}\boldsymbol{x}b f(x)ωTxb 回归问题 利用最小二乘法&#xff0c;得到 ω \boldsymbol{\omega} ω和 b b b的参数估计$ \boldsymbol{\hat{\omega}}…...

门静脉高压——表现

一、门静脉高压表现 00:01 1. 门静脉构成 00:13 组成结构&#xff1a;由肠系膜上静脉和脾静脉汇合构成&#xff0c;是肝脏血液供应的主要来源。淤血后果&#xff1a;门静脉淤血会同时导致脾静脉和肠系膜上静脉淤血&#xff0c;引发后续系列症状。 2. 脾大和脾功能亢进 00:46 …...