indexeddb 在浏览器隐私模式下通常不可用,需通过试探性打开操作并设置超时来检测;不可用时应按 memory-only map → sessionstorage → cookie 降级,并妥善捕获异常、提供用户提示与备选方案。

在浏览器隐私模式(如 Chrome 的无痕窗口、Safari 的私密浏览)下,IndexedDB 通常会被禁用或强制拒绝打开数据库,导致 indexedDB.open() 触发错误(如 UnknownError、VersionError 或直接不回调),甚至某些版本 Safari 会静默失败。因此不能假设 IndexedDB 总是可用,需主动检测、降级并优雅处理异常。
检测 IndexedDB 是否真正可用
仅检查 window.indexedDB 存在不够——隐私模式下该对象仍在,但调用 open() 会失败。应发起一次轻量级试探性打开操作,并设置超时兜底:
- 用
indexedDB.open("__test__", 1)创建临时库,立即删除(event.target.result.close(); indexedDB.deleteDatabase("__test__")) - 监听
onerror和onupgradeneeded;若 1.5 秒内无响应或报错,视为不可用 - 注意:Safari 私密模式可能触发
onblocked或直接不触发任何回调,需依赖超时判断
降级策略:按优先级链式 fallback
当 IndexedDB 不可用时,依次尝试更受限但隐私模式中可能仍工作的存储方案:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- memory-only Map:最安全降级,所有数据仅存于内存,页面刷新即丢失,适合缓存临时状态(如表单草稿、UI 展开状态)
-
sessionStorage:部分隐私模式允许(如 Firefox 私密窗口),但 Safari 私密模式默认禁用;使用前需用
try { sessionStorage.setItem("x","x"); }实时探测 - cookie(仅小量元数据):不受隐私模式限制,但容量极小(4KB)、随请求发送,仅适合标记(如“用户已看过引导”)
- 避免使用 localStorage:Chrome/Firefox 隐私模式下抛
SecurityError,Safari 直接返回空对象且静默失败
异常捕获与用户感知控制
IndexedDB 错误不应导致功能崩溃,尤其涉及离线数据同步等核心路径:
- 所有
open()、transaction()、put()操作必须包裹try/catch并监听onsuccess/onerror事件 - 对非关键写入(如分析埋点、非必要缓存),可设为“尽力而为”:错误时仅记录日志,不阻塞主流程
- 对关键读写(如用户未提交的文档),应在 UI 明确提示:“当前处于隐私模式,部分内容可能无法保存”,并提供导出为文件(
Blob + download)的备选操作
兼容性细节与 Safari 特别处理
Safari 是隐私模式 IndexedDB 问题最严重的浏览器,需额外适配:
- iOS 15+ / macOS Monterey 起,Safari 私密模式下 IndexedDB 完全禁用(连
indexedDB.open都不执行回调),必须依赖超时判定 - 避免使用
indexedDB.databases():该 API 在 Safari 中未实现,且隐私模式下不可用 - 若应用强依赖持久化,可在进入页面时检测环境:
/private/URL 参数、navigator.webdriver或 UA 字符串(不推荐)辅助判断,但最终以实际 IndexedDB 探测为准
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










