Html 为什么Chrome 27中从来没有调用过onversionchange?
当我尝试升级数据库时,尽管抛出了Html 为什么Chrome 27中从来没有调用过onversionchange?,html,google-chrome,google-chrome-extension,indexeddb,google-chrome-app,Html,Google Chrome,Google Chrome Extension,Indexeddb,Google Chrome App,当我尝试升级数据库时,尽管抛出了IDBVersionChangeEvent事件(它被发送到我的onupgrade回调),但从未调用onversionchange!这导致我有一个阻塞的事件。我不知道如何让它调用正确的处理程序 使用Chrome 27 //Account for different names of indexedDB window.indexedDB = window.indexedDB || window.webkitIndexedDB || window.mozIndexedD
IDBVersionChangeEvent
事件(它被发送到我的onupgrade
回调),但从未调用onversionchange
!这导致我有一个阻塞的事件。我不知道如何让它调用正确的处理程序
使用Chrome 27
//Account for different names of indexedDB
window.indexedDB = window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB;
//Account for different names of transaction and key range
window.IDBTransaction = window.IDBTransaction || window.webkitIDBTransaction || window.msIDBTransaction;
window.IDBKeyRange = window.IDBKeyRange || window.webkitIDBKeyRange || window.msIDBKeyRange;
var req = indexedDB.open( "test6", 2 );
req.onupgradeneeded = function(event)
{
console.log( "This upgrade gets called" );
//These do nothing
event.target.onversionchange = function(event) { console.log( "request version change" ); };
event.target.result.onversionchange = function(event) { console.log( "database version change" ); };
};
req.onsuccess = function(event)
{
console.log( "This Success is called" );
//These do nothing
event.target.onversionchange = function(event) { console.log( "request version change" ); };
event.target.result.onversionchange = function(event) { console.log( "database version change" ); };
};
req.onerror = function(event)
{
console.log( "This error is not called" );
};
req.onblocked = function(event)
{
console.log( "This blocked is sometimes called" );
};
//This also does nothing
req.onversionchange = function(event) { console.log( "request version change" ); };
我试着在任何地方添加它,但它从未被调用过
编辑(未解决)出现indexedDB.deleteDatabase()
调用onversionchange处理程序!不确定原因,但升级没有。onversionchange
事件是实例。所以你应该这样听
req.onsuccess = function(e) {
db = e.target.result;
db.onversionchange = function(e) {
db.close();
}
}
onversionchange
事件是实例。所以你应该这样听
req.onsuccess = function(e) {
db = e.target.result;
db.onversionchange = function(e) {
db.close();
}
}
当另一个请求尝试增加版本时,会在数据库中触发versionchange事件。因此,如果您在上面代码的底部添加
var req2 = indexedDB.open( "test6", 3 ); // <- note: "3"
req2.onblocked = function(e) { console.log("this will be called"); };
req2.onupgradeneeded = function(e) {
console.log("this will be called once the first connection is closed");
};
当另一个请求尝试增加版本时,会在数据库中触发versionchange事件。因此,如果您在上面代码的底部添加
var req2 = indexedDB.open( "test6", 3 ); // <- note: "3"
req2.onblocked = function(e) { console.log("this will be called"); };
req2.onupgradeneeded = function(e) {
console.log("this will be called once the first connection is closed");
};
onblocked
触发的事实很可能意味着您在其他地方打开了一个数据库连接,可能在另一个选项卡中
onversionchange
事件在该其他选项卡(或可能多个选项卡)中激发
您需要监听数据库连接对象上的onversionchange
事件,并在那里处理它。例如,您可以关闭那里的db连接,并显示一个对话框,指示用户应该重新加载页面以获取新的db版本
这样做:
req.onsuccess = function(event)
{
var db = event.target.result
db.onversionchange = function(event) {
document.body.innerHTML = "" // or a more subtle way to disable the page
db.close()
window.alert("please reload the page for the latest version")
}
};
我最近没有与IndexedDB密切合作,但我想我记得,onblocked
会激发,不管其他活动的db连接是否有一个关闭db的onversionchange侦听器。我认为您总是会首先得到onblocked
,如果/当所有连接都关闭时,您将得到onsuccess
事件,允许您使用新的数据库
当您执行indexedDB.deleteDatabase()
操作时,您看到onversionchange
事件触发的原因是您试图在该选项卡中打开连接时删除数据库。触发onblocked
的事实很可能意味着您在其他地方打开了一个db连接,可能在另一张账单上
onversionchange
事件在该其他选项卡(或可能多个选项卡)中激发
您需要监听数据库连接对象上的onversionchange
事件,并在那里处理它。例如,您可以关闭那里的db连接,并显示一个对话框,指示用户应该重新加载页面以获取新的db版本
这样做:
req.onsuccess = function(event)
{
var db = event.target.result
db.onversionchange = function(event) {
document.body.innerHTML = "" // or a more subtle way to disable the page
db.close()
window.alert("please reload the page for the latest version")
}
};
我最近没有与IndexedDB密切合作,但我想我记得,onblocked
会激发,不管其他活动的db连接是否有一个关闭db的onversionchange侦听器。我认为您总是会首先得到onblocked
,如果/当所有连接都关闭时,您将得到onsuccess
事件,允许您使用新的数据库
执行indexedDB.deleteDatabase()
操作时,您看到onversionchange
事件触发的原因是,您试图在该选项卡中打开连接时删除数据库。无效。它仍然不会开火。如果你看一下我的代码,你会发现我已经在做了。你的调用db.close()
?在测试之前,请关闭所有浏览器实例并确保没有挂起的软件更新。是否可以测试上述代码?onversionchange
有人给你打电话吗?唐,不会打。你听到的对象不对。正如我所说的,您将收听数据库对象。请再次查看我的代码。你看到我的event.target.result.onversionchange=function(event){console.log(“数据库版本更改”);}代码>?那就是监听数据库。还是没人打电话,没用。它仍然不会开火。如果你看一下我的代码,你会发现我已经在做了。你的调用db.close()
?在测试之前,请关闭所有浏览器实例并确保没有挂起的软件更新。是否可以测试上述代码?onversionchange
有人给你打电话吗?唐,不会打。你听到的对象不对。正如我所说的,您将收听数据库对象。请再次查看我的代码。你看到我的event.target.result.onversionchange=function(event){console.log(“数据库版本更改”);}代码>?那就是监听数据库。还是没人打电话。你能用chrome试试吗?它仍然不会激发db.onversionchange
。它确实调用了db.onupgradeneeded
,但不调用onversionchange
。你能在chrome中试试吗?它仍然不会激发db.onversionchange
。它确实调用了db.onupgradeneeded
,但没有onversionchange
。我没有其他选项卡。这是一个托管/打包的应用程序。它只有一个实例。我同意db在某个地方是打开的,而不是关闭的,但我在哪里可以得到通知。我唯一打开的地方就是那个托管应用的唯一实例。这就是我被难倒的原因。我没有其他账单。这是一个托管/打包的应用程序。它只有一个实例。我同意db在某个地方是打开的,而不是关闭的,但我在哪里可以得到通知。我唯一打开的地方就是那个托管应用的唯一实例。这就是我被难倒的原因。