2013-03-20 55 views
0

我试图创建一个登录表单。我有几个用户名(对象)在数据库中。我创建了一个表单,它提取用户名(主键)并检查它是否在数据库中。信息通过我的loginCheck()方法之后,但页面只是刷新,不运行成功,也没有失败的提醒我设置为调试为什么使用indexedDB时我的onsuccess/onerror回调没有被调用?

JS:

//-------------USER DB------------------// 
function startDB(){ 
    //sign in page elements 
    logUser = document.getElementById('logUserName'); 
    logPass = document.getElementById('logPass'); 
    signin = document.getElementById('signin'); 
    signin.addEventListener('click',getLogin); 

    //register page elements 
    mainForm = document.getElementById('mainFormSidebar'); 
    mainForm.addEventListener('submit',addObject); 
    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'); 
    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'); 



    //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 

} 
function showerror(e){ 
    alert('Error: ' + e.code + ' - ' + e.message); 
} 
function start(e){ 
    db = e.target.result; 
    chkAdmin(); 
    showUsers();// Show all values in the object store 
} 
function createdb(e){ 
    var datababase = e.target.result; 
    var myusers = datababase.createObjectStore('users', {keyPath: 'userName'}); 
} 
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 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,terms,school,gender)); 
    } 

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

    //Reset Form Fields 
    resetForm(); 


} 
function getUser(userName, fn, ln, pw, em, dob, tel, bio,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.tm = tm; 
    this.scl = scl; 
    this.gender = gender; 
} 
function showUsers(){ 
    //reset box 
    databox.innerHTML = ''; 
    //set the transaction 
    var mytransaction = db.transaction(['users']); 
    //get object store 
    var myusers = mytransaction.objectStore('users'); 
    //open the cursor and set an order 
    var newcursor = myusers.openCursor(null,"prev"); 
    //show all users on successful load of DB 
    newcursor.addEventListener('success',showUserList); 
} 
function showUserList(e){ 
    //var result = e.target.result; 
    //databox.innerHTML = '<div>' + result.id + ' - ' + result.name + ' - ' + result.date + '</div>'; 
    var cursor = e.target.result; // Capture multiple return values as a cursor 
    // Modify the databox to show the results 
    if (cursor){ 
    /* 
     databox.innerHTML = '<div>' + 
      'Username'+ ' - ' + 
      'First'+ ' - ' + 
      'Last'+ ' - '+ 
      'Pass'+ ' - '+ 
      'Email'+ ' - '+ 
      'DOB'+ ' - '+ 
      'TEL'+ ' - '+ 
      'BIO'+ ' - '+ 
      'NEWS'+ ' - '+ 
      'TOS'+ ' - '+ 
      'SCL'+' - '+ 
      'Gender </div>'; 
    */ 

     databox.innerHTML += '<div>' + 
     cursor.value.userName + ' - ' + 
     cursor.value.fn+ ' - ' + 
     cursor.value.ln+ ' - '+ 
     cursor.value.pw+ ' - '+ 
     cursor.value.em+ ' - '+ 
     cursor.value.dob+ ' - '+ 
     cursor.value.tel+ ' - '+ 
     cursor.value.bio+ ' - '+ 
     cursor.value.tm+ ' - '+ 
     cursor.value.scl+' - '+ 
     cursor.value.gender+ 
     ' <input type="button" onclick="removeobject(\'' + cursor.value.userName + '\')" value="remove"/></div>'; 
      // Add a remove button as inserted HTML 
     cursor.continue(); // Iterates over the cursor 
    } 
} 
function removeobject(keyword){ 
    // Confirm the deletion 
    if(confirm('Are you sure?')){ 
     // Set the transaction 
     var mytransaction = db.transaction(['users'], "readwrite"); 
     // Get the object store 
     var mystore = mytransaction.objectStore('users'); 
     // Delete the record with the chosen index 
     var request = mystore.delete(keyword); 
     // If success, show the updated results 
     mytransaction.addEventListener('complete', showUsers); 
    } 
} 

//reset functions 
function clearForm(){ 
    //Clear form 
    if(confirm('Clear all fields?')){ 
     resetForm(); 
    } 
    showUserList();  
} 
function resetForm(){ 
    //Reset form 
    fname = document.getElementById('fName').value=''; 
    lName = document.getElementById('lName').value=''; 
    uName = document.getElementById('uName').value=''; 
    pass = document.getElementById('password').value=''; 
    email = document.getElementById('email').value=''; 
    dob = document.getElementById('dob').value=''; 
    phone = document.getElementById('phone').value=''; 
    bio = document.getElementById('bio').value=''; 
    nl = document.getElementById('nl').value=''; 
    terms = document.getElementById('terms').checked = false; 
    school = document.getElementById('school').value=''; 
    gender = document.getElementsByName('gender').value=''; 
    showUserList();  
} 


//------Create Admin Account-----// 
function chkAdmin(){ 
    if(localStorage.getItem('admin')!="added"){    
     alert('Adding administrator Account'); 
     addAdmin(); 
    } 
} 
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-Chao','admin')); 
     request.addEventListener('success',showUsers); 
    //Locally store that admin as been created 
     var admin = 'admin'; 
     var value = 'added'; 
     newItem(admin,value); 
} 


//--------Retrieve User Date---------// 
function getLogin(){ 
    alert('getLogin launched'); 
    var user = logUser.value; 
    var pass = logPass.value; 
    alert('User: '+user+' Pass: '+pass+" sent to loginCheck"); 
    loginCheck(user,pass); 
    alert ('user/pass checked'); 
} 

function loginCheck(user,pass){ 
    var transaction = db.transaction(['users']); 
    var mystore = transaction.objectStore('users'); 
    alert('User table opened'); 
    var request = transaction.get(user); 
    alert('passed the get user request'); 
    request.onerror = function (event){ 
     alert("username does not exist"); 
    }; 
    request.onsuccess =function (event){ 
     alert('request was successful'); 
     /*alert("Welcome "+ request.result.userName);*/ 
     //run function populating all fields 

    } 
} 

我把警报在开始(e)函数,它似乎在显示用户/密码的警报之后立即被调用。我环顾四周,我无法弄清楚一直在说什么。另外,如果我将loginCheck更改为此,警报运行并且代码进一步警告('user/pass checked');但是然后开始(e)再次打电话。

回答

1

indexeddb API的工作原理是异步的,这就是为什么警报没有按照您想要的顺序显示。由于API是异步的,意味着所有其他代码都会在等待异步调用完成时执行。

+0

你会碰巧知道为什么在所有函数结束时,start(e)方法被调用?我需要在登录时填写用户信息,以便他们在需要时更新它。但在我运行我的填充函数后,开始(e)运行,并且一切都被擦除。 – Batman 2013-03-20 09:13:57

+1

您确定商店中有数据吗? – 2013-03-20 10:40:02

+0

我相信如此。我创建了一个用所有用户信息填充表单的函数,并且它可以工作,但是每当它完成时,它就会再次刷新并运行开始(e)。林不知道这是否正常,如果我应该使用sessionStorage来捕获我需要的所有信息,并根据该字段填充字段 – Batman 2013-03-20 18:56:40

相关问题