0

データベースをアップグレードしようとすると、IDBVersionChangeEventイベントがスローされても (コールバックに送信されonupgradeます)、onversionchange呼び出されません! blockedこれは私がイベントを開催することにつながります。正しいハンドラーを呼び出す方法がわかりません。

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" ); };

どこにでも追加しようとしましたが、呼び出されません!

編集 (未解決) onversionchangeindexedDB.deleteDatabase()ハンドラを呼び出しているようです! 理由はわかりませんが、アップグレードはしません。

4

3 に答える 3

2

onversionchangeイベントはデータベースインスタンスによってディスパッチされます。だからこう聞くべき

req.onsuccess = function(e) {
  db = e.target.result;
  db.onversionchange = function(e) {
     db.close();
  }
}
于 2013-06-14T02:40:24.067 に答える
1

別の要求がバージョンをインクリメントしようとすると、データベースで 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 イベント ハンドラーを呼び出す必要があります。

編集: Chrome 28.0.1500.45 ベータ版で動作します:

<script>

var req = indexedDB.open( "test6", 2 );

req.onsuccess = function(event)
{
    console.log( "This Success is called" ); 

    //These do nothing
    event.target.onversionchange = function(event) { console.log( "request version change 2" ); };
    event.target.result.onversionchange = function(event) { console.log( "database version change 2" ); };
};

req.onerror = function(event)
{
    console.log( "This error is not called" ); 
};

req.onblocked = function(event)
{
    console.log( "This blocked is sometimes called" ); 
};

var req2 = indexedDB.open( "test6", 3 ); // <- note: "3"
req2.onblocked = function(e) { console.log("this blocked will be called"); };
req2.onupgradeneeded = function(e) {
    console.log("this will be called once the first connection is closed");
};

</script>

与える

This Success is called dogs.html:7
database version change 2 dogs.html:11
this blocked will be called dogs.html:25
于 2013-06-15T21:38:57.677 に答える
0

発生するという事実はonblocked、おそらく別のタブで、別の場所でデータベース接続が開いていることを意味します。

onversionchangeイベントは、その他のタブ (または多くのタブ) で発生します。

onversionchangeそこでdb接続オブジェクトでイベントをリッスンし、そこで処理する必要があります。たとえば、そこで 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")
      }
  };

onblocked最近は IndexedDB と密接に連携していませんが、他のアクティブな db 接続に db を閉じる onversionchange リスナーがあるかどうかに関係なく、それが起動することを覚えていると思います。常に最初に取得すると思います。onblockedすべての接続が閉じられた場合はonsuccessイベントが発生し、新しいデータベースで作業できるようになります。

onversionchangeそのときにイベントが発生する理由はindexedDB.deleteDatabase()、そのタブで接続を開いている間にデータベースを削除しようとしたためです。

于 2013-06-15T23:47:08.927 に答える