【问题标题】:Stored value generating [object HTMLInputElement]存储值生成 [object HTMLInputElement]
【发布时间】:2013-03-21 05:23:55
【问题描述】:

我有一个 indexedDB 并将其用于登录功能。我正在尝试在用户登录时使用用户信息填充表单。但是该表单使用 [object HTMLInputElement] 而不是用户信息填充。

这是我带用户(db key)访问对象(用户)的地方

编辑这是我运行的站点:http://www3.carleton.ca/clubs/sissa/html5/admin.html 我的站点编辑器会在我保存时对其进行更新,因此在我尝试新事物时站点脚本可能会有所更改。

这是我带用户(db key)访问对象(用户)的地方

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;
}

【问题讨论】:

  • 不要在客户端 JavaScript 中进行身份验证。您发布的代码向我展示了如何仅使用 Web 浏览器来发现数据库中每个用户的密码。身份验证必须在服务器上完成。必须存在没有可以将用户密码返回给客户端 JavaScript 的 API。
  • 这是一个学校作业。我们必须使用 JavaScript 和 indexedDB API 来做到这一点
  • 换学校。 :) 说真的,如果您的讲师建议您在客户端 JavaScript 中检索密码,即使作为练习,我也会对课程提出异议。
  • 这是一门关于 HTML5 的商务课程。他只是希望我们使用 indexedDB 来完成这项任务。

标签: javascript html object indexeddb


【解决方案1】:

只看一行:

fName.value = fName

您正在将fNamevalue 属性设置为fName 本身。

与其创建大量全局变量,不如直接在populateFields()中使用loggedUser

fName.value = loggedUser.fn;

编辑:看看your site,我看到了你遗漏的重要部分。 populateFields() 在页面重新加载后被调用。因此,populateFields() 无法访问在页面重新加载之前创建的任何变量

既然我在帮你做作业,我不想只是把答案放在银盘上给你。诀窍是必须从数据库中检索用户数据,并在调用它之前或从函数内部将其提供给populateFields()。您可以将用户对象作为全局变量使用,但最好将其作为参数传入。

您可能还想取消表单提交:

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

然后直接从loggedIn() 调用populateFields() 而不是getValues()

【讨论】:

  • loggedUser 公开为全局变量。
  • @Batman - 当你重新加载页面时,你所有的变量都消失了,你从头开始。现在,您的代码捕获用户数据并将其存储在变量中,然后通过允许提交表单来重新加载页面。当页面再次加载时,您的代码会尝试使用您在表单提交之前创建的变量。但是没了!页面已重新加载!变量不会在页面加载之间持续存在。
  • 这就是使用 indexedDB 的重点,不是吗?数据始终可用?您已经在 localstorage 中获得了可用的用户名,这就是从 indexedDB 检索用户所需的全部内容。只需从 indexedDB 中检索数据。 (并取消表单提交。)
  • 否,从数据库中检索数据,而不是从 localStorage。从 localStorage 中检索用户名并使用它从数据库中获取用户详细信息。
  • 不,getValue() 将不起作用。请改用getLogin(e)。最好使用form.onsubmit 处理程序,但getLogin() 可能就足够了。
猜你喜欢
  • 1970-01-01
  • 2012-11-23
  • 2015-09-28
  • 1970-01-01
  • 2021-09-07
  • 1970-01-01
  • 1970-01-01
  • 2016-12-19
  • 1970-01-01
相关资源
最近更新 更多