2012-03-01 16 views
5

Tôi đã cố gắng sử dụng mã sau để kiểm tra hiệu suất của IndexedDB. Mã được sửa đổi từ http://www.html5rocks.com/en/tutorials/indexeddb/todo/, Nó hoạt động tốt trong chrome, nhưng không thành công trong Firefox 10, nói rằng "db.setVersion không phải là một hàm". Tôi muốn biết làm thế nào tôi có thể sửa đổi mã để làm cho nó hoạt động trong firefox?Lấy "setVersion" không phải là lỗi chức năng khi sử dụng chỉ mụcDB

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

     } 

Trả lời

3

Thông số kỹ thuật chưa được hoàn thành. Điều này hiện được vận chuyển dưới dạng thuộc tính mozIndexedDB trong Gecko và webkitIndexedDB trong Chrome cho đến khi tiêu chuẩn được hoàn tất. Vì vậy, bạn phải viết cho moz cũng. Bây giờ mã này chỉ dành cho webkit.

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

+0

Cảm ơn. Chrome có hỗ trợ sự kiện "onupgradeneeded" này không? Nói cách khác, tôi có cần phải giữ "setVersion" cho chrome để sử dụng không? – user840866

+0

Trên 17+ Chrome có kế hoạch triển khai nó nhưng chưa được xác nhận. Tốt để sử dụng setVersion cho bây giờ & chrome sẽ hỗ trợ nó cho vài bản phát hành khác, ngay cả khi nó triển khai "onupgradeneeded". –

1

setVersion() is Deprecated

Cách mới là xác định phiên bản trong phương pháp IDBDatabase.open()

firefox từ phiên bản 10,0 cụ open() với các đặc điểm kỹ thuật mới trong đó một IndexedDB cơ sở dữ liệu IDBDatabase phiên bản được đặt làm tham số thứ hai của phương thức open()

dụ

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

0

Vấn đề ở đây không phải là một lựa chọn là câu trả lời chính xác.

Vấn đề là các ví dụ được lập chỉ mục trên HTML5Rocks được ghi vào thông số trước IndexeDB tháng 1. Nhóm làm việc kể từ đó đã xuất bản thay đổi đột phá từ API setVersion sang kiểu onupgradedneeded mới.

Ở đây, Firefox về mặt kỹ thuật là không đúng. Star this issue nếu bạn muốn xem Chrome cũng làm như vậy.

Các vấn đề liên quan