Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/89.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 对象没有方法”;开放式;使用indexedDB时出错_Javascript_Html_Indexeddb - Fatal编程技术网

Javascript 对象没有方法”;开放式;使用indexedDB时出错

Javascript 对象没有方法”;开放式;使用indexedDB时出错,javascript,html,indexeddb,Javascript,Html,Indexeddb,我正在尝试构建一个类似于容器的小类,它将使从HTML5 IndexedDB加载和存储数据变得更干净。老实说,这是我第一次使用这个功能,所以我的问题可能很小 我的代码基于本教程: 函数DBDictionary() { this.Holder={}; this.Entries=新数组(); 这个.Opened=false; 这一点。v=“1.0”; this.Holder.indexedDB=window.indexedDB | | | window.webkitIndexedDB | | win

我正在尝试构建一个类似于容器的小类,它将使从HTML5 IndexedDB加载和存储数据变得更干净。老实说,这是我第一次使用这个功能,所以我的问题可能很小

我的代码基于本教程:

函数DBDictionary()
{
this.Holder={};
this.Entries=新数组();
这个.Opened=false;
这一点。v=“1.0”;
this.Holder.indexedDB=window.indexedDB | | | window.webkitIndexedDB | | window.mozIndexedDB;
如果('webkitIndexedDB'在窗口中)
{
window.IDBTransaction=window.webkitibdransaction;
window.IDBKeyRange=window.webkitIDBKeyRange;
}
this.Holder.indexedDB={};
this.Holder.indexedDB.db=null;
this.Holder.indexedDB.onerror=函数(e)
{
控制台日志(e);
};
this.DownloadDB=函数()
{
如果(打开)返回;
var请求=此.Holder.indexedDB.open(“存储”);
request.onsuccess=函数(e)
{
this.Holder.indexedDB.db=e.target.result;
var db=this.Holder.indexedDB.db;
//我们只能在setVersion事务中创建对象存储;
如果(v!=db.version)
{
var setVrequest=db.setVersion(v);
//onsuccess是我们唯一可以创建对象存储的地方
setVrequest.onerror=this.Holder.indexedDB.onerror;
setVrequest.onsuccess=函数(e)
{
if(db.objectStoreNames.contains(“存储”))db.deleteObjectStore(“存储”);
var store=db.createObjectStore(“存储”{keyPath:“Key”});
这是PopulateAll();
};
}
其他的
{
这是PopulateAll();
}
};
request.onerror=this.Holder.indexedDB.onerror;
};
this.UploadDB=函数()
{       
这是DeleteAll();
这是SaveAll();
};
this.DeleteAll=函数()
{
var db=this.Holder.indexedDB.db;
var trans=db.transaction([“存储”],IDBTransaction.READ_WRITE);
var store=trans.objectStore(“存储”);
forEach(函数(元素、索引、数组)
{
var请求=store.delete(索引);
request.onerror=函数(e)
{
日志(“删除错误:”,e);
};
});
};
this.PopulateAll=函数()
{
var db=this.Holder.indexedDB.db;
var trans=db.transaction([“存储”],IDBTransaction.READ_WRITE);
var store=trans.objectStore(“存储”);
//把店里所有的东西都拿到手;
var keyRange=IDBKeyRange.lowerBound(0);
var cursorRequest=store.openCursor(keyRange);
cursorRequest.onsuccess=函数(e)
{
var结果=e.target.result;
//没有更多要加载的结果
如果(!!结果==错误)
{
如果(!this.Opened)this.Opened=true;
返回;
}
this.Entries[result.Key]=result.Value;
result.continue();
};
cursorRequest.onerror=this.Holder.indexedDB.onerror;
};
this.SaveAll=函数()
{
var db=this.Holder.indexedDB.db;
var trans=db.transaction([“存储”],IDBTransaction.READ_WRITE);
var store=trans.objectStore(“存储”);
forEach(函数(元素、索引、数组)
{
风险值数据={
“关键”:索引,
“价值”:要素,
“时间戳”:新日期().getTime()
};
var请求=store.put(数据);
request.onerror=函数(e){
日志(“添加错误:”,e);
};
});
};
}
函数main()
{
var dictionary=new DBDictionary();
dictionary.DownloadDB();
dictionary.Entries[“hello”]=“world”;
警报(字典条目[“hello”]);
}
$(文件).ready(主);
我想要的实现状态应该如下所示:

这应该做的是从浏览器的IndexedDB对象下载数据,并将它们存储到包含对象的数组条目中。当我想将Entires的值存储回DB中时,我会调用dictionary.UploadDB()


但是,我得到了一个javascript错误:uncaughttypeerror:Object没有方法“open”。我几乎不知道我做错了什么。有人能给我一些建议吗?

做一种检查,然后
控制台.log
检查
这个.Holder.indexedDB
对象以检查原型。它是否继承了
IDBDatabase
原型?如果有,您将可以使用
open
方法

如果您的
window.indexedDB
启动了成功回调,
e.target.result
将是通过事件对象访问新打开数据库的正确方法。但事实上,您没有走那么远,这表明您的
this.Holder.indexedDB
对象实际上不是
IDBDatabase
的实例

编辑:是的,这正是您的问题。如果您对this.holder.indexedDB对象进行console.log操作,则会得到一个类似于
{“db”:null}
的对象


打开
调用时,将
这个.Holder.indexedDB
交换为
窗口.webkitinexeddb
,您将看到“世界”警报弹出。jsiddle.

您可能使用的浏览器不支持IndexDBNo,它支持IndexDBNo;我正在使用最新版本的Chrome。只需遵循教程就可以了,但我的实现不行。脚注:这段代码只适用于Chrome,因为基于它的HTML5Rocks示例使用了旧的规范(2011年12月之前)。在当前等级库中打开数据库时,需要传递
function main()
{
    var dictionary = new DBDictionary();
    dictionary.DownloadDB();

    dictionary.Entries["hello"] = "world";
    alert(dictionary.Entries["hello"]);
}

$(document).ready(main);