0

ユーザー登録に関するフォーム情報をキャプチャするために使用しようとしているindexedDBがあります。その部分は正常に機能していますが、教授は、ログインできるように、作成時にユーザー名とパスワードを設定してアカウントを1回作成することを望んでいます。

私がこれに取り組む方法は、localStorageAPIを使用することでした。管理者アカウントが作成されたことがあるかどうかを確認する関数を作成し、作成されていない場合は、addAdmin()関数を呼び出して作成しました。

addObject()をコピーしてaddAdmin()を作成しようとしましたが、何らかの理由で、db変数がコンソールで未定義として返されます。

エラー"UncaughtTypeError:undefinedのメソッド'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);       
}
4

1 に答える 1

0

の値を何かに割り当てていないdbため、常に未定義です。メソッドでそれを行うつもりだと思いますが、実際には、ハンドラーがトリガーするメソッドでcreatedbそれをキャプチャ/割り当てる必要があります(メソッドもどこにも見つかりません)startsuccessstart

于 2013-03-20T02:35:44.017 に答える