2013-06-28 205 views
0

我想創建一個數據管理應用程序,而不是基於Windows的解決方案或使用WebSQL,我正在使用IndexedDB。我很新,但我相信我已經介紹了這個代碼草案的基礎。無論如何,我的問題是,無論何時我運行代碼,我的openDB()函數和addeventListener()函數都在運行時在控制檯日誌上運行並顯示,但所有其他函數在嘗試運行代碼。問題是什麼?功能未定義

在HTML文件中,引用了jQuery腳本文件。

 (function() { 
     var DB_NAME = 'shodex'; 
     var DB_VERSION = 1; 
     var DB_STORE_NAME = 'visitors'; 
     var db; 

     var current_view_pub_key; 

     //opens the IndexedDB database 
     function openDb() { 
     console.log("open Database......"); 
     var req = indexedDB.open(DB_NAME, DB_VERSION); 
     req.onsuccess = function (evt) { 
     db = this.result; 
     console.log("Database Opened"); 
     }; 
     req.onerror = function (evt) { 
     console.error("openDb:", evt.target.errorCode); 
     }; 
     req.onupgradeneeded = function (evt) { 
     console.log("Event fired when DB is needed to be upgraded"); 
     var store = evt.currentTarget.result.createObjectStore(
     DB_STORE_NAME, { keyPath: 'id', autoIncrement: true }); 
     store.createIndex('name', 'name', { unique: false }); 
     store.createIndex('date', 'date', { unique: false }); 
     store.createIndex('whom_to_see', 'whom_to_see', { unique: false }); 
     store.createIndex('arrival_time', 'arrival_time', { unique: false }); 
     store.createIndex('reason', 'reason', { unique: false }); 
     store.createIndex('departure_time', 'departure_time', { unique: false }); 
     }; 
      } 

     //used to create a transaction 
     function getObjectStore(store_name, mode) { 
     var tx = db.transaction(store_name, mode); 
     return tx.objectStore(store_name); 
     } 

     //adds a Visitor to the IndexedDB 
     function addVisitor(name, date, to_see, arrival_time, reason, departure_time) { 
     console.log("Adding the following data to IndexedDB: ", arguments); 
     var obj = { name: name, date: date, whom_to_see: to_see, arrival_time: arrival_time, reason: reason, departure_time: departure_time }; 
     if(typeof blob != undefined) 
     { 
      obj.blob = blob; 
     } 
     var store = getObjectStore(DB_STORE_NAME, 'readwrite'); 
     var req; 
     try 
     { 
      req = store.add(obj); 
     } 
     catch(e) 
     { 
      if(e.name == 'DataCloneError') 
      displayActionFailure("This engine does not know how to clone a Blob, use Firefox!"); 
      throw(e); 
     } 
     req.onsuccess = function (evt) { 
      console.log("Insertion into DB was successful. You can heave a huge sigh of relief!"); 
      displayActionSuccess(); 
     }; 
     req.onerror = function() { 
      console.error("Insertion into DB failed!"); 
      displayActionFailure(this.error); 
     }; 
    } 

    function displayActionSuccess() { 
     alert("Whatever the heck you were doing was successful. Congrats!"); 
    } 

    function displayActionFailure() { 
     alert("Oh Oh! System Failure! System Failure!"); 
    } 

    // listens for the submit button event 
    function addEventListeners() { 
     console.log("Event Listeners"); 
     $('#addVisitor').click(function(evt) { 
      console.log("Add Visitors Submit button"); 
      var name = document.getElementsByName("txtName").value; 
      var date = document.getElementsByName("txtDate").value; 
      var whom_to_see = document.getElementsByName("txtToSee").value; 
      var time_of_arrival = document.getElementsByName("txtArrivalTime").value; 
      var reason_for_visit = document.getElementsByName("txtReason").value; 
      var time_of_departure = document.getElementsByName("timeOfDep"); 
      addVisitor(name, date, whom_to_see, time_of_arrival, reason_for_visit, time_of_departure); 
     }); 
    } 
//makes the database open at runtime 
openDb(); 
addEventListeners(); 
}) 
(); 

回答

0

引用像以前一樣的JavaScript代碼,而不是.. 。

我刪除了所有其它功能從javascript文件離開openDB()函數,並把他們安置在主HTML文件。它會自動工作。

0

語法錯誤 - 您需要結束時的圓括號。 即加

);

+0

哦,是的,我已經做了,忘了貼吧。看看現在的代碼 –

0

我認爲問題在於,當您的匿名函數運行時,瀏覽器並不知道'#addVisitor'元素,因此不會創建該元素的單擊事件處理程序。

你應該把你的代碼中的 「$(函數(){」 或 「$(文件)。就緒(函數(){」:

$(function() { 
    (function() { 
     var DB_NAME = 'shodex'; 
     var DB_VERSION = 1; 
     ... 
+0

試過了。沒有工作 –