1

我有最新版本的 Firefox 和 IE,但是html5rocks.com中的示例在这两个浏览器中不起作用。我用 Chrome 测试过,效果很好。我注意到这些浏览器在尝试打开 indexedDB 时不会触发任何事件(“onsuccess”或“onerror”),如下所示。

var request = indexedDB.open("todos");

请分享此问题的任何想法/解决方案。

4

4 回答 4

6

要使 html5rocks 演示在 Firefox 上运行,您需要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 演示的工作版本的链接,扩展了两个新功能,用于查看详细信息数据和更新值。

于 2012-06-15T14:28:21.313 回答
2

Chrome 落后于 IndexedDB 标准。

12 月推出了新的修订版,Firefox 和 IE 已升级。Chrome 还没有。

我相信运行 HTML5Rocks.com 的主要是 Chrome 团队中的人,所以这些示例会落后是有道理的。

2010 年 12 月前后 API 之间的重大变化是setVersion请求的变化和新的onupgradeneeded回调。

于 2012-05-06T21:44:14.393 回答
0

IE 不支持 IndexedDB。访问 html5test.com 进行验证

2015 年编辑:IndexedDB API在 IE中可用,版本 10

于 2012-05-06T13:45:49.560 回答
0

Todo 列表示例是在 chrome 上实现的过时 IndexedDB 规范。现在您必须使用 onupgardedneeded 方法,并且现在也要使用 setVersion。

于 2012-09-03T15:30:24.257 回答