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在某个地方是打开的,而不是关闭的,但我在哪里可以得到通知。我唯一打开的地方就是那个托管应用的唯一实例。这就是我被难倒的原因。