Javascript 在Firefox中打开IndexedDB时出现InvalidStateError
在Firefox 17.0.1中,当我尝试打开IndexedDB数据库时,Firebug控制台向我显示InvalidStateError异常。还引发了Javascript 在Firefox中打开IndexedDB时出现InvalidStateError,javascript,firefox,indexeddb,Javascript,Firefox,Indexeddb,在Firefox 17.0.1中,当我尝试打开IndexedDB数据库时,Firebug控制台向我显示InvalidStateError异常。还引发了request.onerror事件,但未定义event.target.errorCode 有没有人有在Firefox中使用IndexedDB的经验 更新 Firefox 18.0.1也有同样的行为 我非常确定您得到的错误是版本错误,这意味着数据库的当前版本高于您打开数据库时使用的版本。如果查看event.target.error,您将看到名称将包含
request.onerror
事件,但未定义event.target.errorCode
有没有人有在Firefox中使用IndexedDB的经验
更新
Firefox 18.0.1也有同样的行为 我非常确定您得到的错误是版本错误,这意味着数据库的当前版本高于您打开数据库时使用的版本。如果查看event.target.error,您将看到名称将包含“VersionError” 另一种可能性是您将看到“AbortError”,这意味着版本更改事务被中止。这意味着OnUpgradeRequired事件中存在导致中止的错误。如果您正在创建一个已经存在的对象存储,您可能会得到这个结果
如果不提供更多关于错误的信息,我也看不到其他的可能性。您需要在一个单独的事务中创建对象存储,您将打开的数据库和创建对象存储事务合并到同一个事件中 此外,对象存储中不能同时使用
自动增量
和路径
。你必须选择其中一个
下面是将使您的示例运行的代码:
function initDB() {
if (window.indexedDB) {
var request = window.indexedDB.open('demo', 1);
request.onsuccess = function(event) {
db = event.target.result;
createObjectStore();
};
request.onupgradeneeded = function(event) {
db = event.target.result;
$('#messages').prepend('blah blah<br/>');
};
request.onerror = function(event) {
$('#messages').prepend('Chyba databáze #' + event.target.errorCode + '<br/>');
};
}
}
function createObjectStore() {
db.close();
var request = window.indexedDB.open('demo', 2);
request.onsuccess = function(event) {
db = event.target.result;
showDB();
};
request.onupgradeneeded = function(event) {
db = event.target.result;
$('#messages').prepend('yeah yeah yeah<br/>');
var store = db.createObjectStore('StoreName', { keyPath: 'id' });
store.createIndex('IndexName', 'id', { unique: true });
};
request.onerror = function(event) {
$('#messages').prepend('Chyba databáze #' + event.target.errorCode + '<br/>');
};
}
函数initDB(){
if(window.indexedDB){
var请求=window.indexedDB.open('demo',1);
request.onsuccess=函数(事件){
db=event.target.result;
createObjectStore();
};
request.onupgradeneeded=函数(事件){
db=event.target.result;
$(“#消息”).prepend('blah blah
');
};
request.onerror=函数(事件){
$('#messages').prepend('Chyba databáze'+event.target.errorCode+'
');
};
}
}
函数createObjectStore(){
db.close();
var请求=window.indexedDB.open('demo',2);
request.onsuccess=函数(事件){
db=event.target.result;
showDB();
};
request.onupgradeneeded=函数(事件){
db=event.target.result;
$(“#消息”).prepend('yes-yes-yes
');
var store=db.createObjectStore('StoreName',{keyPath:'id'});
createIndex('IndexName','id',{unique:true});
};
request.onerror=函数(事件){
$('#messages').prepend('Chyba databáze'+event.target.errorCode+'
');
};
}
如果您开始陷入困境,可以看看我为Firefox插件sdk编写的一些indexeddb代码。代码比您需要的更复杂,但您将能够看到所有需要发生的事件、错误和事务顺序
祝你好运 我回答这个问题是因为这个问题仍然存在(在Firefox54中)。如果您:
- 在私有模式下使用Firefox
- 或者在不同的Firefox版本之间切换(,)
值得称赞。如果浏览器在FireFox设置的隐私选项卡中设置为“不存储历史”,则FireFox在使用IndexedDB时也会抛出“InvalidStateError” 我相信FireFox基本上是在匿名模式下运行的。
IndexedDB在私有模式下运行FireFox时不可用。Hi,我在FF 17.0.1上测试了它,它对我也有效,在19.0.1上也是如此。你确定没有其他问题吗?可能您浏览器上db的当前版本高于1,这就是为什么会出现错误?尝试在更高版本中打开db,查看它是否工作。我尝试在另一个域上运行代码,但错误相同。当我在Firebug中调试JS时,
onupgradeneeded
没有被激发。Kristof说的是,你需要打开数据库而不使用version属性。这就是你得到版本错误的原因。丹尼是正确的。通过调用不带版本号的open方法,您将以其当前版本打开数据库。完成后,您应该能够使用event.target.result.version在成功句柄中检查数据库的当前版本删除版本号没有帮助。Mozila的IndexedDB演示中有一个版本号:当您没有提供版本号时,会出现什么错误?您是否查看了event.target.error以查看得到的错误?你可以做的另一件事是获取我的包装器和查看器。使用my viewer,您将能够获得数据库的详细信息。在上,您将找到我的库和查看器。在我的博客上你会发现如何使用它。
function initDB() {
if (window.indexedDB) {
var request = window.indexedDB.open('demo', 1);
request.onsuccess = function(event) {
db = event.target.result;
createObjectStore();
};
request.onupgradeneeded = function(event) {
db = event.target.result;
$('#messages').prepend('blah blah<br/>');
};
request.onerror = function(event) {
$('#messages').prepend('Chyba databáze #' + event.target.errorCode + '<br/>');
};
}
}
function createObjectStore() {
db.close();
var request = window.indexedDB.open('demo', 2);
request.onsuccess = function(event) {
db = event.target.result;
showDB();
};
request.onupgradeneeded = function(event) {
db = event.target.result;
$('#messages').prepend('yeah yeah yeah<br/>');
var store = db.createObjectStore('StoreName', { keyPath: 'id' });
store.createIndex('IndexName', 'id', { unique: true });
};
request.onerror = function(event) {
$('#messages').prepend('Chyba databáze #' + event.target.errorCode + '<br/>');
};
}
if (window.indexedDB) {
var request = window.indexedDB.open('demo', 1);
request.onsuccess = function(event) {
// not raised
};
request.onupgradeneeded = function(event) {
// not raised
};
request.onerror = function(event) {
// raised with no InvalidStateError
if (request.error && request.error.name === 'InvalidStateError') {
event.preventDefault();
}
};
}