最可靠简洁的IndexedDB兼容性检测是先检查window.indexedDB是否为对象且其open方法为函数,再降级尝试webkitIndexedDB等前缀版本,需验证open方法存在而非仅判断window.indexedDB是否存在。

直接检查 window.indexedDB 是否存在,并结合其子属性(如 open)是否为函数,是最可靠、最简洁的判断方式。
基础兼容性检测
IndexedDB 的全局接口在支持的浏览器中挂载在 window.indexedDB 上。但要注意:部分旧版浏览器(如早期 IE)可能提供 webkitIndexedDB 或 mozIndexedDB 等前缀版本,现代标准写法应优先检测标准名称,再降级尝试前缀。
- 先判断
typeof window.indexedDB === 'object'且window.indexedDB.open是函数 - 若失败,再依次检查
window.webkitIndexedDB、window.mozIndexedDB、window.msIndexedDB - 只要任一存在且具备
open方法,就认为基本可用
避免仅依赖 typeof 判断
typeof window.indexedDB 在某些不完全支持的环境(如部分安卓 WebView)中可能返回 "object",但实际调用 open() 会报错。因此必须验证关键方法是否存在:
- 不能只写
if (window.indexedDB) - 应写成
if (window.indexedDB && typeof window.indexedDB.open === 'function') - 更严谨可加
try/catch尝试创建一个极简数据库实例(如 open 后立即 close),但日常兼容检测通常无需这步
封装一个轻量检测函数
可将逻辑封装为复用函数,返回布尔值或具体可用的 IDB 对象:
立即学习“前端免费学习笔记(深入)”;
function supportsIndexedDB() {
const candidates = [
window.indexedDB,
window.webkitIndexedDB,
window.mozIndexedDB,
window.msIndexedDB
];
for (let db of candidates) {
if (db && typeof db.open === 'function') {
return true;
}
}
return false;
}
调用 supportsIndexedDB() 即可获得兼容性结果,适合在初始化阶段快速决策是否启用离线存储逻辑。
注意 Safari 的特殊情况
iOS Safari 10.3+ 和 macOS Safari 10.1+ 开始支持 IndexedDB,但早期版本(尤其 iOS indexedDB.open 可能触发 onupgradeneeded,但后续 transaction 会失败。因此生产环境建议增加运行时可用性验证,而非仅靠 UA 或静态检测。



















