代码之家  ›  专栏  ›  技术社区  ›  Batman

IndexedBD和localStorage未定义错误

  •  0
  • Batman  · 技术社区  · 11 年前

    我有一个indexedDB,我试图用它来捕获用户注册时的表单信息。这部分工作正常,但教授希望创建一个帐户,并在创建时设置用户名和密码,这样他就可以登录了。

    我采用的方法是使用localStorage API。我创建了一个函数来检查是否创建过管理员帐户,如果没有创建,则调用addAdmin()函数。

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

    错误“Uncaught TypeError:无法调用未定义的方法“transaction”

    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);       
    }
    
    1 回复  |  直到 11 年前
        1
  •  0
  •   Aaron Powell    11 年前

    您没有分配的值 db 对任何事物,所以它总是未定义的。我想你是想在 createdb 方法,但实际上您应该在 start 方法 success 处理程序将触发(我也找不到 开始 任何地方的方法)