Создание сохраненного значения [объект HTMLInputElement]

У меня есть indexedDB и я использую его для функции входа в систему. Я пытаюсь заполнить форму информацией о пользователях при входе в систему. Однако форма заполняется [object HTMLInputElement] вместо информации о пользователях.

Здесь я беру пользователя (ключ db) для доступа к объекту (пользователь)

РЕДАКТИРОВАТЬ Это мой сайт, на котором он работает: http://www3.carleton.ca/clubs/sissa/html5/admin.html Редактор моего сайта обновляет его по мере того, как я сохраняю его, поэтому возможны изменения в скрипте сайта, когда я пробую что-то новое.

Здесь я беру пользователя (ключ db) для доступа к объекту (пользователь)

function loginCheck(user,pass){    db.transaction("users").objectStore("users").get(user).onsuccess = function(event) {
    var loggedUser = event.target.result;
        if(!loggedUser){
            alert('Sorry, Username does not exist. Please try again.');
        }else if(pass !== loggedUser.pw ){
            alert('Incorrect log in combination. Please try again.');
            }else{loggedIn(loggedUser);}        
    }    
}
function loggedIn(loggedUser){
    var u=loggedUser;
    alert('Welcome '+u.fn+' '+u.ln+' to Macroplay');

    //function to populate fields 
    alert('get values called'); 
    getValues(u);

    //session store     
    var signedin = 'user';
    var username = u.userName;
    newLocal(signedin,username);
    alert('local storage set'); 
}

Я использую эту функцию getValues ​​для хранения различных полей, которые я хочу от объекта.

РЕДАКТИРОВАТЬ: я объявил переменную test глобальной и сохранил имя пользователя (fn). В предупреждениях отображается правильное имя, но при заполнении по-прежнему отображается неопределенное значение.

    var test;
function getValues(loggedUser){
    var u = loggedUser;
    alert('storing first name');
    test = u.fn;
    alert('First name = '+test);
    lName = u.ln; 
    users = u.userName;
    pass = u.pw;
    email = u.em;
    dob = u.dob;
    tel = u.tel;
    bio = u.bio;
    school = u.scl; 
    alert('user values stored');  
    if(u.gender == 'M'){
        gender[0].checked= true ;
    }else{gender[1].checked= true ;}        
}

Это функция, которую я использую для заполнения формы, которая дает мне [object HTMLInputElement]

function populateFields(){
    alert('Name of populated field: '+test);
    fName.value = test;
    lName.value = lName;
    users.value = users;
    pass.value = pass;
    email.value = email;
    dob.value = dob;
    tel.value = tel; 
    bio.value = bio;
    terms.disabled = true;
    school.value = school;  
    alert('populate fields done');

    save.value = 'Update';
    signin.innerHTML = 'Log Out';
    registerLabel.innerHTML = 'Account Information';

     //open user info form
    var accountInfo = document.getElementsByTagName('details');
    accountInfo[1].open = open;
}

person Batman    schedule 21.03.2013    source источник
comment
Не выполняйте аутентификацию в клиентском JavaScript. Код, который вы разместили, показывает мне, как узнать пароли каждого пользователя в вашей базе данных, используя только веб-браузер. Аутентификация должна выполняться на сервере. Не должно существовать отсутствия API, который мог бы возвращать пароль пользователя клиентскому JavaScript.   -  person gilly3    schedule 21.03.2013
comment
Это для школьного задания. Мы должны сделать это с помощью JavaScript и API indexedDB.   -  person Batman    schedule 21.03.2013
comment
Сменить школу. :) Серьезно, если ваш инструктор предлагает вам извлекать пароли с помощью JavaScript на стороне клиента, даже в качестве упражнения, я не согласен с учебным планом.   -  person gilly3    schedule 21.03.2013
comment
Это коммерческий курс по HTML5. Он просто хочет, чтобы мы использовали indexedDB для этого задания.   -  person Batman    schedule 21.03.2013


Ответы (1)


Просто посмотрите на одну строчку:

fName.value = fName

Вы устанавливаете для свойства value fName значение fName.

Вместо создания множества глобальных переменных просто используйте loggedUser непосредственно в populateFields():

fName.value = loggedUser.fn;

Изменить: просматривая ваш сайт, я см. важный бит, который вы пропустили. populateFields() вызывается после перезагрузки страницы. Таким образом, populateFields() не имеет доступа ни к одной переменной, созданной до перезагрузки страницы.

Поскольку я помогаю тебе с домашним заданием, я не хочу просто вручать тебе ответ на блюдечке с голубой каемочкой. Хитрость заключается в том, что пользовательские данные должны быть извлечены из базы данных и сделаны доступными для populateFields() до ее вызова или внутри функции. Вы можете сделать пользовательский объект доступным как глобальную переменную, но может быть лучше передать его как параметр.

Вероятно, вы также захотите отменить отправку формы:

document.getElementById("loginForm").onsubmit = function (e) {
    e.preventDefault();
}

А затем просто вызовите populateFields() напрямую из loggedIn() вместо getValues().

person gilly3    schedule 21.03.2013
comment
Я пробовал это, но не думаю, что loggedUser будет работать в populateFields(), потому что он находится вне транзакции indexedDB. Я получаю loggedUser undefined. - person Batman; 21.03.2013
comment
Предоставьте loggedUser как глобальную переменную. - person gilly3; 21.03.2013
comment
Я удалил var из loggedUser из loginCheck(), но это ничего не изменило. Я получаю сообщение об ошибке: невозможно прочитать fn из неопределенного. - person Batman; 21.03.2013
comment
привет @gilly3, ты сказал, что мне нужно сделать данные доступными для populateFields() до того, как она будет вызвана. Я попытался сделать это, сохранив данные в глобальной переменной с именем test (отредактированный OP/site), а затем используя эту тестовую переменную в полях заполнения, но она вернула значение undefined в текстовом поле. Кроме того, я не вызываю populateFields() из getValues(), он запускается из start(e) при загрузке страницы, чтобы узнать, вошел ли кто-нибудь в систему. Это неправильно? Спасибо. - person Batman; 22.03.2013
comment
Кроме того, я не уверен, что понимаю, почему я должен отменить отправку формы? - person Batman; 22.03.2013
comment
@Batman - Когда вы перезагружаете страницу, все ваши переменные исчезают, и вы начинаете с нуля. Прямо сейчас ваш код захватывает пользовательские данные и сохраняет их в переменной, а затем перезагружает страницу, разрешая отправку формы. Когда страница снова загружается, ваш код пытается использовать переменную, которую вы создали перед отправкой формы. Но его больше нет! Страница была перезагружена! Переменные не сохраняются между загрузками страницы. - person gilly3; 22.03.2013
comment
О, моя страница автоматически перезагружается при отправке формы. Я этого не знал. Мне нужно, чтобы информация оставалась сохраненной, даже если пользователь покинет страницу (вроде как, оставьте меня в системе). Считаете ли вы, что я должен хранить каждую часть пользовательских данных, используя локальное хранилище? Может ли это решить мои проблемы? - person Batman; 22.03.2013
comment
В этом весь смысл использования indexedDB, не так ли? Чтобы данные всегда были доступны? У вас уже есть имя пользователя, доступное в локальном хранилище, и это все, что вам нужно, чтобы получить пользователя из indexedDB. Просто извлеките данные из indexedDB. (И отмените отправку формы.) - person gilly3; 22.03.2013
comment
Извините, я не был уверен, что это был ответ «да» на мой вопрос о хранении всего с использованием localStorage. Итак, например, uesrname,name,last,tel и т. д., а затем используйте что-то вроде fname.value = localStorage.getItem(fname); Извините, если я задал много вопросов, это все очень ново для меня. Кроме того, я поместил код для отмены отправки формы в getValue()? Это последний метод перед завершением транзакции БД, поэтому я подумал, что это сработает. - person Batman; 22.03.2013
comment
Нет, извлекать данные из базы данных, а не из localStorage. Получите имя пользователя из localStorage и используйте его для получения сведений о пользователе из базы данных. - person gilly3; 22.03.2013
comment
Нет, getValue() не сработает. Вместо этого используйте getLogin(e). Лучше всего использовать обработчик form.onsubmit, но и getLogin() вполне достаточно. - person gilly3; 22.03.2013
comment
давайте продолжим это обсуждение в чате - person gilly3; 22.03.2013
comment
Я еще не заставил его работать, но, исходя из того, что вы говорите, функция getValues() совершенно не нужна, верно? Потому что, если страница перезагружается, сохраненные значения исчезают, поэтому в этой функции нет смысла. Верный? - person Batman; 22.03.2013
comment
Давайте продолжим обсуждение в чате - person gilly3; 22.03.2013