我有最新版本的Firefox和IE,但html5rocks.com中的示例在这两种浏览器中不起作用。我用Chrome测试过,它工作正常。 我注意到这些浏览器在尝试打开indexedDB时不会触发任何事件('onsuccess'或'onerror'),如下所示。
var request = indexedDB.open("todos");
请分享此问题的任何想法/解决方案。
答案 0 :(得分:6)
要使Firefox上的html5rocks演示工作,您需要在数据库打开时附加onupgradeneeded
事件而不是setversion
方法来创建数据库。
这是适用于Firefox和Chrome的代码示例:
myStorage.indexedDB.open = function() {
var v = 1;
var request = indexedDB.open("todos", v);
//Firefox code for db init
request.onupgradeneeded = function (e) {
myStorage.indexedDB.db = e.target.result;
var db = myStorage.indexedDB.db;
// We can only create Object stores in a setVersion transaction;
if(db.objectStoreNames.contains("todo")) {
var storeReq = db.deleteObjectStore("todo");
}
var store = db.createObjectStore("todo",
{keyPath: "timeStamp"});
}
request.onsuccess = function(e) {
myStorage.indexedDB.db = e.target.result;
var db = myStorage.indexedDB.db;
//Chrome code for db init
if (v!= db.version && db.setVersion) {
var setVrequest = db.setVersion(v);
// onsuccess is the only place we can create Object Stores
setVrequest.onerror = myStorage.indexedDB.onerror;
setVrequest.onsuccess = function(e) {
if(db.objectStoreNames.contains("todo")) {
db.deleteObjectStore("todo");
}
var store = db.createObjectStore("todo",
{keyPath: "timeStamp"});
myStorage.indexedDB.getAllTodoItems();
};
}
else
myStorage.indexedDB.getAllTodoItems();
};
request.onerror = myStorage.indexedDB.onerror;
}
编辑:这是我在github上维护的html5roks ToDo演示的工作版本的链接,扩展了两个用于查看详细信息数据和更新值的新功能。
答案 1 :(得分:2)
Chrome支持IndexedDB标准。
12月推出了新版本,Firefox和IE已升级。 Chrome还没有。
我相信大多数来自Chrome工作人员的人都会运行HTML5Rocks.com,所以这些例子落后的原因是有道理的。
2010年12月之前和之后的API之间的重大变化是setVersion
请求和新onupgradeneeded
回调的变化。
答案 2 :(得分:0)
IE不支持IndexedDB。访问html5test.com进行验证
编辑2015:自版本10起,IndexedDB API为available in IE
答案 3 :(得分:0)
Todo list示例是在chrome上实现的过时的IndexedDB规范。现在你必须使用onupgardedneeded方法,并且现在也设置好了版本。