如何检测IndexedDB是否已启用

3
我想知道如何在JavaScript中检测IndexedDB是否可用和启用。
我目前正在进行以下测试:
if (window.indexedDB) {
    if ((using_chrome && browserVersion >= 24)
        || (usingFirefox && browserVersion >= 16)
        || (usingIe && browserVersion >= 10)
        || (usingEdge && browserVersion >= 12)
        || (usingSafari && browserVersion >= 9)) {
        accessible = true;
    } 
} 

但我更喜欢使用特性检测而不是依赖版本号。

假设测试IndexedDB的特性检测是有效的,有没有人知道一种在页面加载时测试它的好方法?


1
也许可以看一下 https://modernizr.com ? - DannyThunder
在网络上,不建议基于版本号来白名单浏览器功能,因为你永远不知道新的浏览器何时加入市场。相反,你应该假设浏览器支持它,或者尝试使用像Michał Perłakowski描述的方法来检测它,否则只黑名单那些你知道不支持该功能的浏览器。 - sleblanc
2个回答

4
您可以使用Modernizr进行检查:
if (Modernizr.indexeddb) {
  console.log("IndexedDB is supported.");
} else {
  console.log("IndexedDB is not supprorted.");
}

请注意,现在几乎所有的现代浏览器都支持IndexedDB(参见caniuse.com)。


我的担忧是用户可能会禁用该功能。那么,在这种情况下,这些变量是否会为假值?通过保存/获取值来“测试”IndexedDB是否合理? - Marc
@user1431343 我认为这些变量可能是“未定义的(undefined)”,这是假值(falsy)。 - Michał Perłakowski
1
Safari/iOS 8和9的indexedDB支持非常不稳定(据说在Safari 10中已经修复)。您可以使用var dontUseFaultyIndexedDB = /^Apple/.test(navigator.vendor) && /AppleWebKit[/]60.*Version[/][89][.]/.test(navigator.appVersion);来可靠地嗅探不可靠的版本。请参见http://caniuse.com/#feat=indexeddb。 - robocat
2
Firefox在私密模式下不支持IndexedDB,但仍会返回一个等于True的window.indexedDB。 - tobltobs

4

使用来自 MDN 的代码,你还需要填写一些其他功能:

// In the following line, you should include the prefixes of implementations you want to test.
window.indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB;
// DON'T use "var indexedDB = ..." if you're not in a function.
// Moreover, you may need references to some window.IDB* objects:
window.IDBTransaction = window.IDBTransaction || window.webkitIDBTransaction || window.msIDBTransaction || {READ_WRITE: "readwrite"}; // This line should only be needed if it is needed to support the object's constants for older browsers
window.IDBKeyRange = window.IDBKeyRange || window.webkitIDBKeyRange || window.msIDBKeyRange;
// (Mozilla has never prefixed these objects, so we don't need window.mozIDB*)

if ( !window.indexedDB ) {
  alert("No DB");
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接