2013-03-20 96 views
0

我有一个索引数据库,它试图用来捕获用户注册表单信息。该部分工作正常,但教授想要创建一个帐户,使用创建时设置的用户名和密码,以便他可以登录。IndexedBD和localStorage undefined error

我接触到的方式是使用localStorage API。我创建了一个函数来检查管理员帐户是否曾经创建过,如果不创建它,则调用addAdmin()函数。

我试图通过复制我的addObject()来创建addAdmin(),但由于某种原因,我的数据库变量在控制台中返回为undefined。

错误”遗漏的类型错误:无法调用未定义

var mainForm, fName, lName, uName, pass, email, dob, phone, bio, nl, terms, school, gender, save, reset, db; 




//-------------USER DB------------------// 
function startDB(){ 
    mainForm = document.getElementById('mainFormSidebar'); 
    fname = document.getElementById('fName'); 
    lName = document.getElementById('lName'); 
    users = document.getElementById('uName'); 
    pass = document.getElementById('password'); 
    email = document.getElementById('email'); 
    dob = document.getElementById('dob'); 
    phone = document.getElementById('phone'); 
    bio = document.getElementById('bio'); 
    nl = document.getElementById('newsletter'); 
    terms = document.getElementById('terms'); 
    school = document.getElementById('school'); 
    gender = document.getElementsByName('gender'); 
    save = document.getElementById('save'); 
    reset = document.getElementById('reset'); 
    reset.addEventListener('click',clearForm); 
    databox = document.getElementById('databox'); 

    mainForm.addEventListener('submit',addObject); 

    //open DB 
    var request = indexedDB.open('macroPlay'); 
    //if fails 
    request.addEventListener('error', showerror); 
    //if succeeds 
    request.addEventListener('success', start); 
    //if !exist, create. 
    request.addEventListener('upgradeneeded', createdb); 

    //Create Admin account on launch 
    chkAdmin(); 
} 
function createdb(e){ 
    var datababase = e.target.result; 
    var myusers = datababase.createObjectStore('users', {keyPath: 'userName'}); 
} 
function start(e){ 
    db = e.target.result; 


showUsers();// Show all values in the object store 
} 

function addObject(){ 
    if(confirm('Are you sure you want to resgister?')){ 
     var fName = document.getElementById('fName').value; 
     var lName = document.getElementById('lName').value; 
     var userName = document.getElementById('uName').value; 
     var pass = document.getElementById('password').value; 
     var email = document.getElementById('email').value; 
     var dob = document.getElementById('dob').value; 
     var phone = document.getElementById('phone').value; 
     var bio = document.getElementById('bio').value; 
     var nl = document.getElementById('nl').value; 
     var terms = document.getElementById('terms').value; 
     var school = document.getElementById('school').value; 

     //May need to set a loop to find value of radio 
     var gender; 
     var radios = document.getElementsByName('gender'); 

     for (var i = 0, length = radios.length; i < length; i++) { 
      if (radios[i].checked) { 
       gender=radios[i].value; 
      } 
     } 

     //set up transaction 
     var mytransaction = db.transaction(['users'], "readwrite"); 

     //get object store 
     var myusers = mytransaction.objectStore('users'); 

     //Add item 
     var request = myusers.add(new getUser(userName,fName,lName,pass,email,dob,phone,bio,nl,terms,school,gender)); 
    } 

    // Show all results. 
    mytransaction.addEventListener('complete', showUsers); 

    //Reset Form Fields 
    resetForm(); 


} 
function getUser(userName, fn, ln, pw, em, dob, tel, bio, nl,tm, scl, gender){ 
    this.userName = userName; 
    this.fn = fn; 
    this.ln = ln; 
    this.pw = pw; 
    this.em = em; 
    this.dob = dob; 
    this.tel = tel; 
    this.bio = bio; 
    this.nl = nl; 
    this.tm = tm; 
    this.scl = scl; 
    this.gender = gender; 
} 
//------Create Admin Account-----// 
function chkAdmin(){ 
    alert('before adding admin'); 
    if(localStorage.getItem('admin')!="added"){    
     alert('adding admin'); 
     addAdmin(); 
     alert('admin added'); 
    } 
} 
function addAdmin(){ 
    //set up transaction 
     var mytransaction = db.transaction(['users'], "readwrite"); 
    //get object store 
     var myusers = mytransaction.objectStore('users'); 
     var request = myusers.add(new getUser('admin','Shawn','Smith-Choa','admin')); 
     request.addEventListener('success',showUsers); 
    //Locally store that admin as been created 
     var admin = 'admin'; 
     var value = 'added'; 
     newItem(admin,value); 
} 

//-------------Web Storage API------------// 
function newItem(id,style){ 
    localStorage.setItem(id,style);  
} 

回答

0

所以它总是不确定你不分配的db到任何东西的价值的方法‘交易’我想你的意思是做它在createdb的方法,但真的是你应该拍摄/在start方法,它的success处理器将触发分配给它(我也找不到任何地方start法)

+0

“不分配DB的任何东西的价值所以它总是未定义的。“我不明白为什么当他们在createDB中做同样的事情时这不是问题?我会尝试在start()函数中运行chkAdmin(),看看是否有帮助。我更新了OP以包含开始 – Batman 2013-03-20 03:19:33

相关问题