上一篇
html5本地缓存存储数据
- 行业动态
- 2025-05-08
- 4746
HTML5本地缓存通过
localStorage
和 sessionStorage
实现数据存储,前者持久化键值对,后者会话级存储,均支持离线访问,适用于网页数据缓存与状态
HTML5 本地缓存存储数据详解
localStorage
- 定义:提供持久化的键值对存储,数据保存在浏览器中,即使关闭页面或浏览器也不会丢失。
- 特点:
- 仅支持字符串类型的数据(需手动序列化/反序列化)。
- 同一域名下的所有页面共享数据。
- 容量限制约为 5MB(不同浏览器可能有差异)。
- 常用 API:
localStorage.setItem(key, value)
:存储数据。localStorage.getItem(key)
:获取数据。localStorage.removeItem(key)
:删除指定键的数据。localStorage.clear()
:清空所有数据。
- 示例:
localStorage.setItem('username', 'John'); const name = localStorage.getItem('username'); // 返回 'John'
sessionStorage
- 定义:提供会话级的键值对存储,数据仅在当前页面会话期间有效,标签页关闭后数据清除。
- 特点:
- 仅支持字符串类型的数据。
- 同一标签页内的页面共享数据,其他标签页或窗口不共享。
- 容量限制与
localStorage
类似(约 5MB)。
- 常用 API:
sessionStorage.setItem(key, value)
:存储数据。sessionStorage.getItem(key)
:获取数据。sessionStorage.removeItem(key)
:删除指定键的数据。sessionStorage.clear()
:清空所有数据。
- 示例:
sessionStorage.setItem('tempData', 'test'); const data = sessionStorage.getItem('tempData'); // 返回 'test'
IndexedDB
- 定义:基于事务的低级 API,用于存储大量结构化数据(如数据库),支持索引和复杂查询。
- 特点:
- 支持存储二进制数据(如文件、Blob)。
- 容量限制较大(通常数百 MB 至数 GB)。
- 异步操作,需处理回调或 Promise。
- 数据持久化,除非显式删除。
- 常用 API:
indexedDB.open(databaseName)
:打开数据库。transaction.objectStore(storeName)
:操作对象存储(类似表)。objectStore.add(data)
:添加数据。objectStore.get(key)
:获取数据。objectStore.delete(key)
:删除数据。
- 示例:
const dbRequest = indexedDB.open('myDatabase'); dbRequest.onsuccess = (event) => { const db = event.target.result; const transaction = db.transaction('users', 'readwrite'); const store = transaction.objectStore('users'); store.add({ id: 1, name: 'Alice' }); };
对比表格
特性 | localStorage | sessionStorage | IndexedDB |
---|---|---|---|
数据持久性 | 长期存在 | 会话结束即清除 | 长期存在 |
数据类型 | 字符串(需转换) | 字符串(需转换) | 结构化数据(对象等) |
容量限制 | 约 5MB | 约 5MB | 数百 MB ~ 数 GB |
作用域 | 同源所有页面 | 当前标签页 | 同源所有页面 |
API 复杂度 | 简单键值对 | 简单键值对 | 复杂(类似数据库) |
适用场景
- localStorage:长期存储配置项(如用户偏好、主题设置)。
- sessionStorage:临时存储会话数据(如表单填写中途刷新)。
- IndexedDB:大规模数据存储(如离线应用、文件缓存)。
相关问题与解答
问题 1:如何选择合适的本地存储方式?
- 解答:
- 若需长期保存少量简单数据(如用户设置),优先使用
localStorage
。 - 若数据仅在当前会话中使用(如临时状态),选择
sessionStorage
。 - 若需存储复杂结构或大量数据(如离线应用数据库),使用
IndexedDB
。 - 避免将敏感信息(如密码)存入
localStorage
,因其易被脚本读取。
- 若需长期保存少量简单数据(如用户设置),优先使用
问题 2:如何实现本地存储的“过期时间”功能?
- 解答:
localStorage
和sessionStorage
本身不支持过期时间,需手动实现:- 存储数据时,额外记录时间戳(如
{ value: 'data', expire: Date.now() + 3600000 }
)。 - 读取时检查当前时间是否超过
expire
,若过期则删除数据并返回null
。 - 示例代码:
function setWithExpire(key, value, ttl) { const data = { value, expire: Date.now() + ttl }; localStorage.setItem(key, JSON.stringify(data)); } function getWithExpire(key) { const json = localStorage.getItem(key); if (!json) return null; const { value, expire } = JSON.parse(json); if (Date.now() > expire) { localStorage.removeItem(key); return null; } return value;
- 存储数据时,额外记录时间戳(如