下面是我的代码:
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");
};
};
但没有触发任何事件。除了readyState设置为“done”且结果设置为IDBDatabase对象之外,所有DBOpenRequest属性都设置为null。
这里缺少了什么,所以我可以通过db变量访问indexdb?
2条答案
按热度按时间ffscu2ro1#
1.您不需要等待浏览器触发load事件。indexedDB就绪与DOM就绪无关。您只需indexedDB.open在全局范围内调用www.example.com,它最终就会执行。
1.您可能不需要检查供应商前缀的语句。前缀通常已被删除。只需使用window.indexedDB并删除此语句即可。
1.您还应该侦听blocked事件。此事件通常在同时在多个选项卡中打开同一页面时触发。当被阻止时,其他事件将不会触发。
db = DBOpenRequest.result
行似乎正在将一个只在函数作用域内有效的值(IDBDatabase对象的示例)赋给在外部作用域内定义的变量,而在外部作用域内该值不再有效。这表明您缺乏编写和使用异步代码的经验。在继续之前,您可能应该了解更多有关异步代码的信息。f5emj3cl2#
例如,在onsuccess中,db来自事件,而不是原始对象:
最有可能的情况是,您的控制台中出现了此错误。