上一篇
html5离线存储
- 行业动态
- 2025-05-06
- 2
HTML5离线存储包括localStorage(持久化键值存储)、sessionStorage(会话级存储)和IndexedDB(结构化数据库),支持网页离线数据缓存与本地数据管理
HTML5离线存储详解
HTML5离线存储
HTML5 提供了两种在客户端存储数据的机制:localStorage
和 sessionStorage
,它们均基于键值对(Key-Value)的存储模式,数据以字符串形式保存,且仅在同源(Same-Origin)策略下可访问,与 Cookie 相比,它们的容量更大(通常约 5MB),且不会随请求自动发送到服务器。
localStorage
与 sessionStorage
对比
特性 | localStorage | sessionStorage |
---|---|---|
生命周期 | 永久有效,除非手动清除或用户清理缓存 | 会话级有效,窗口/标签页关闭后清除 |
作用范围 | 同源下所有页面共享 | 仅当前窗口/标签页内的所有页面共享 |
数据持久性 | 是 | 否 |
适用场景 | 长期存储配置、用户偏好等 | 临时存储会话级数据(如表单状态) |
使用方法与 API 操作
基本操作方法
方法名 | 说明 | 示例代码 |
---|---|---|
setItem(key, value) | 设置键值对(覆盖已有值) | localStorage.setItem('name', 'John') |
getItem(key) | 获取指定键的值 | localStorage.getItem('name') |
removeItem(key) | 删除指定键值对 | localStorage.removeItem('name') |
clear() | 清空所有键值对 | localStorage.clear() |
key(index) | 获取索引对应的键名(从 0 开始) | localStorage.key(0) |
存储复杂数据类型
由于值必须是字符串,需通过 JSON
序列化/反序列化:
// 存储对象 const user = { name: 'Alice', age: 25 }; localStorage.setItem('user', JSON.stringify(user)); // 读取对象 const userData = JSON.parse(localStorage.getItem('user')); console.log(userData.name); // Alice
典型应用场景
用户偏好设置
- 主题切换(如浅色/深色模式)
- 语言选择或布局配置
- 示例:
localStorage.setItem('theme', 'dark');
表单数据缓存
- 自动保存未提交的表单数据
- 示例:
sessionStorage.setItem('formData', JSON.stringify(formData));
购物车功能
- 临时存储商品信息(
sessionStorage
)或长期存储(localStorage
)
- 临时存储商品信息(
注意事项
数据类型限制
- 仅支持字符串,需手动处理对象/数组的序列化。
- 错误示例:
localStorage.setItem('num', 123);
→ 实际存储为字符串"123"
。
安全风险
- 避免存储敏感信息(如密码),因易受 XSS 攻击。
- 建议结合 HTTPS 使用,防止数据被改动。
性能与容量
- 单域名容量约 5MB,适合轻量级存储。
- 大量数据或复杂查询建议使用
IndexedDB
。
同步 API
setItem
、removeItem
等方法是同步操作,可能阻塞主线程。- 解决方案:拆分操作或使用 Web Workers。
相关问题与解答
问题 1:如何存储数组或对象?
解答:需将数据转换为 JSON 字符串后存储,读取时再解析为对象。
// 存储数组 const fruits = ['Apple', 'Banana']; localStorage.setItem('fruits', JSON.stringify(fruits)); // 读取数组 const storedFruits = JSON.parse(localStorage.getItem('fruits'));
问题 2:localStorage
容量不足时如何处理?
解答:
- 优先清理过期或不必要的数据(如使用时间戳标记)。
- 若需长期存储大量数据,改用
IndexedDB
(支持更大容量和复杂查询)。 - 示例清理逻辑:
// 删除所有键中包含 'temp_' 的数据 Object.keys(localStorage).forEach(key => { if (key.includes('temp_')) { localStorage.removeItem(key);