获得“;setVersion”;在使用indexedDB时不是函数错误

Getting a "setVersion" is not a function error when using indexedDB

本文关键字:函数 错误 indexedDB setVersion 获得      更新时间:2023-09-26

我尝试使用以下代码来测试IndexedDB的性能。代码修改自http://www.html5rocks.com/en/tutorials/indexeddb/todo/,它在chrome中运行良好,但在Firefox 10中失败了,称"db.setVersion不是一个函数"。我想知道如何修改代码以使其在firefox中工作?

        var count=0;
        var MAX=10;
        var times=3;
        var allTime;
        var stime;
        var etime;
        var html5rocks = {};
        var indexedDB = window.indexedDB || window.webkitIndexedDB ||
                        window.mozIndexedDB;
        if ('webkitIndexedDB' in window) {
            window.IDBTransaction = window.webkitIDBTransaction;
            window.IDBKeyRange = window.webkitIDBKeyRange;
        }
        html5rocks.indexedDB = {};
        html5rocks.indexedDB.db = null;
        html5rocks.indexedDB.onerror = function(e) {
            //console.log(e);
            alert("Why didn't you allow my web app to use IndexedDB?!");  
        };
        html5rocks.indexedDB.open = function(type) {
        var request = indexedDB.open("todos");
            request.onsuccess = function(e) {
            var v = "1.20";
            html5rocks.indexedDB.db = e.target.result;
            var db = html5rocks.indexedDB.db;
            // We can only create Object stores in a setVersion transaction;
            if (v!= db.version) {
                var setVrequest = db.setVersion(v);
                // onsuccess is the only place we can create Object Stores
                setVrequest.onerror = html5rocks.indexedDB.onerror;
                setVrequest.onsuccess = function(e) {
                    if(db.objectStoreNames.contains("todo")) {
                        db.deleteObjectStore("todo");
                    }
                    var store = db.createObjectStore("todo",
                        {keyPath: "number"});
                        addTest();
                };
            }
            else addTest();
            };
            request.onerror = html5rocks.indexedDB.onerror;
        }
        html5rocks.indexedDB.addTodo = function(todoText,num) {
            var db = html5rocks.indexedDB.db;
            var trans = db.transaction(["todo"], IDBTransaction.READ_WRITE);
            var store = trans.objectStore("todo");
            var data = {
            "text": todoText,
            "number": num
            };
            var request = store.put(data);
            request.onsuccess = function(e) {
                count++;
                if(count>=times*MAX)
                {
                    etime=new Date;
                    var t=document.getElementById('result').innerHTML;
                    document.getElementById('result').innerHTML=t+((etime.valueOf()-stime.valueOf())/times)+"<br/>";
                    allTime=0;stime=new Date;count=0;
                    getTest();
                }
            };
            request.onerror = function(e) {
            console.log("Error Adding: ", e);
            };
        };
        html5rocks.indexedDB.getTodo = function(id) {
            var db = html5rocks.indexedDB.db;
            var trans = db.transaction(["todo"], IDBTransaction.READ_WRITE);
            var store = trans.objectStore("todo");
            var request = store.get(id);
            request.onsuccess = function(e) {
                count++;
                if(count>=times*MAX)
                {
                    etime=new Date;
                    var t=document.getElementById('result').innerHTML;
                    document.getElementById('result').innerHTML=t+((etime.valueOf()-stime.valueOf())/times)+"<br/>";
                    allTime=0;stime=new Date;count=0;
                    delTest();
                }
            };
            request.onerror = function(e) {
            console.log("Error getting: ", e);
            };
        };
        html5rocks.indexedDB.deleteTodo = function(id) {
            var db = html5rocks.indexedDB.db;
            var trans = db.transaction(["todo"], IDBTransaction.READ_WRITE);
            var store = trans.objectStore("todo");
            var request = store.delete(id);
            request.onsuccess = function(e) {
                count++;
                if(count>=times*MAX)
                {
                    etime=new Date;
                    var t=document.getElementById('result').innerHTML;
                    document.getElementById('result').innerHTML=t+((etime.valueOf()-stime.valueOf())/times)+"<br/>";
                    allTime=0;stime=new Date;count=0;
                    dataTest();
                }
            };
            request.onerror = function(e) {
            console.log("Error Adding: ", e);
            };
        };
        html5rocks.indexedDB.addData = function(d) {
            var db = html5rocks.indexedDB.db;
            var trans = db.transaction(["todo"], IDBTransaction.READ_WRITE);
            var store = trans.objectStore("todo");
            var data={
                "text":d,
                "number":1
            };
            var request = store.put(data);
            request.onsuccess = function(e) {
                etime=new Date;
                var t=document.getElementById('result').innerHTML;
                document.getElementById('result').innerHTML=t+((etime.valueOf()-stime.valueOf()))+"<br/>";
            };
            request.onerror = function(e) {
            console.log("Error Adding: ", e);
            };
        };

        function addTest() {
            for(i=1;i<=times*MAX;i++)
                html5rocks.indexedDB.addTodo('          ',i);
        }
        function getTest() {
            for(i=1;i<=times*MAX;i++)
                html5rocks.indexedDB.getTodo(Math.round(Math.random()*(MAX*times-1)+1));
        }
        function delTest() {
            for(i=1;i<=times*MAX;i++)
                html5rocks.indexedDB.deleteTodo(i);
        }
        function dataTest() {
            data=' ';
            for(i=1;i<=21;i++)
                data=data+data;
            stime=new Date
            html5rocks.indexedDB.addData(data);
        }
        function init() {
            stime=new Date;
            allTime=0;
            html5rocks.indexedDB.open();
        }

规范尚未最终确定。在标准最终确定之前,它目前在Gecko和Chrome中分别作为属性mozIndexedDBwebkitIndexedDB提供。所以你也必须为moz写作。现在,此代码仅适用于webkit。

https://developer.mozilla.org/en/IndexedDB

setVersion()已弃用

新方法是在IDBDatabase.open()方法中定义版本

10.0版本的firefox使用新规范实现了open(),其中indexeddb数据库IDBDatabase版本被设置为open()方法的第二个参数

示例

var v = "1.20";
var request = indexedDB.open("todos", v);

html5索引器ddb javascript

这里的问题不是被选为正确答案的问题。

问题是HTML5Rocks上的IndexedDB示例是根据一月份之前的IndexeDB规范编写的。此后,工作组发布了从setVersion API到新onupgradedneeded样式的突破性更改。

在这里,Firefox在技术上是正确的。如果你想看到Chrome也这样做,请在这个问题上加上星号。