DBOpenRequest 事件不触发

DBOpenRequest events do not fire

我正在努力打开索引数据库。这是我的代码:

var db;

window.onload = function()
{    
  window.indexedDB = window.indexedDB || window.mozIndexedDB 
                                      || window.webkitIndexedDB 
                                      || window.msIndexedDB;

  var DBOpenRequest = window.indexedDB.open("test", 1);
    
  DBOpenRequest.onerror = function(event)
  {
     console.log("DBOpenRequest.onerror");
  };
    
  DBOpenRequest.onsuccess = function(event)
  {
    console.log("DBOpenRequest.onsuccess");
    db = DBOpenRequest.result;
  };
    
  DBOpenRequest.onupgradeneeded = function(event)
  {
    console.log("DBOpenRequest.onupgradeneeded");
  };
};

但 none 事件火了。所有 DBOpenRequest 属性都设置为空,除了 readyState 设置为“完成”并且结果设置为 IDBDatabase 对象。

这里缺少什么以便我可以通过 db 变量访问 indexdb?

好吧,首先,在 onsuccess 中,数据库来自事件,而不是原始对象:

db = event.target.result;

您很可能将此视为控制台错误。

  1. 您无需等待浏览器触发加载事件。 indexedDB 准备情况与 DOM 准备情况无关。您可以在全局范围内简单地调用 indexedDB.open,它最终会执行。

  2. 您可能不需要检查供应商前缀的语句。前缀通常已被删除。只需使用 window.indexedDB 并删除此语句。

  3. 您还应该监听被阻止的事件。当大约同时在多个选项卡中打开同一页面时,通常会触发此事件。当被阻止时,其他事件将不会触发。

  4. db = DBOpenRequest.result 似乎正在将一个值(IDBDatabase 对象的实例)分配给一个在外部范围中定义的变量,该值仅在函数范围内有效它不再有效。这表明缺乏编写和使用异步代码的经验。在继续之前,您可能应该了解有关异步代码的更多信息。