2012-03-01 20 views
5

Próbowałem użyć następującego kodu, aby przetestować wydajność IndexedDB. Kod został zmodyfikowany z http://www.html5rocks.com/en/tutorials/indexeddb/todo/, Działa dobrze w chrome, ale kończy się niepowodzeniem w Firefoksie 10, mówiąc "db.setVersion nie jest funkcją". Chcę wiedzieć, w jaki sposób mogę zmodyfikować kod, aby działał w firefox?Uzyskiwanie "setVersion" nie jest błędem funkcji podczas korzystania z indexedDB

 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(); 

     } 

Odpowiedz

3

Specyfikacja nie jest sfinalizowana. Ta wiadomość jest obecnie przesyłana jako usługa mozIndexedDB w Gecko i webkitIndexedDB w przeglądarce Chrome, dopóki standard nie zostanie sfinalizowany. Więc musisz pisać również dla moz. Teraz ten kod jest tylko dla webkita.

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

+0

Dzięki. Czy Chrome obsługuje to zdarzenie "onupgradeneeded"? Innymi słowy, czy muszę używać "setVersion", aby używać chrome? – user840866

+0

Na 17+ chrome planuje go wdrożyć, ale nie jest jeszcze potwierdzone. Dobrze jest używać funkcji setVersion for now & chrome będzie ją obsługiwać przez kilka kolejnych wydań, nawet jeśli implementuje "onupgradeneeded". –

0

Problemem tutaj nie jest jedna wybrana jako poprawną odpowiedź.

Problem polega na tym, że przykłady IndexedDB na HTML5Rocks zostały zapisane w specyfikacji IndexeDB sprzed stycznia. Od tego czasu grupa robocza opublikowała przełomową zmianę, przechodząc od interfejsu API setVersion do nowego stylu onupgradedneeded.

W tym miejscu Firefox jest technicznie poprawny, jeśli nie. Star this issue jeśli chcesz, aby Chrome działał tak samo.

Powiązane problemy