【问题标题】:if statement passed but else statement is also executed - JavaScriptif 语句通过但 else 语句也被执行 - JavaScript
【发布时间】:2021-08-06 18:39:26
【问题描述】:

我有一个登录系统,它遍历一组对象以获取和比较用户在登录页面中输入的用户名和密码。我已经发布了一个 if 语句来检查用户凭据是否正确。问题是即使 if 语句通过或用户凭据正确,系统也会显示 else 语句。

请在下面的链接中查看完整的演示;

https://jsfiddle.net/dej5sr9z/

这是我的 HTML 代码

<!DOCTYPE html>
<html>
<head> 
  <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> 
  <meta http-equiv="X-UA-Compatible" content="IE=9; IE=8; IE=7; IE=EDGE" />
  <meta name="generator" content="Ayub Technologies"> 
  <meta name="author" content="Verai Bosobori" />  
  <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1"> 
  <meta name="description" content="">  
  <title>Lycan CREATIONS | Home</title>
<script type="text/javascript" src="app.js"></script>
</head>
<body>  
        
    <section>
        <div class="form_div">
        <h2>Login</h2>
        <div style="text-align:left; color:red; font-weight:bold;" id="error"></div>
        <div style="text-align:left; color:green; font-weight:bold;" id="success"></div>
        <br>
            <form action="#">
                <div class="form_input">
                    <label for="">Username</label>
                    <input type="text" id="username" placeholder="">                
                </div> <br>
                <div class="form_input">
                    <label for="">Password</label>
                    <input type="password" id="passwd"   placeholder="">
                </div>
                <div class="form_input">
                    <p style="text-align:left; color:blue;"><a href="paswdReset.html">Forgot Password?</a></p>              
                </div>
                <div class="form_submit">
                    <button type="submit" onclick="getInfo()">Submit</button>               
                </div>
            </form>     
        </div>  
    </section>
    
</body>

</html>

Beolow 是 JavaCript 代码

var objPeople =[
        {
            username: "verai",
            passwd: "lycan"
        },
        {
            username: "ayub",
            passwd: "metah"
        },
        {
            username: "chris",
            passwd: "forever"
        }
]

function getInfo(){     
    var username = document.getElementById("username").value;
    var passwd = document.getElementById("passwd").value;
    var error = document.getElementById("error").innerHTML;
    
    if (username != '' || passwd != ''){        
        for(i = 0; i < objPeople.length; i++){
            if(username == objPeople[i].username && passwd == objPeople[i].passwd){
                document.getElementById("success").innerHTML = "Hello " + username + "!! You are successfully logged in!!!";
                console.log(username + " is logged in!!!");
                setTimeout(function(){           
                    document.getElementById("success").innerHTML = "";
                    document.getElementById("username").value = "";
                    document.getElementById("passwd").value = "";
                },5000);
            }else{
                document.getElementById("error").innerHTML = " Incorrect Username or Password. Please try again!";      
                setTimeout(function(){           
                    document.getElementById("error").innerHTML = "";
                    document.getElementById("username").value = "";
                    document.getElementById("passwd").value = "";
                },2000);
                }
        }
    }else{
        // console.log("Your username is " + username + " and your password is " + passwd );
        document.getElementById("error").innerHTML = "All fields required, please try again!";
        setTimeout(function(){           
                document.getElementById("error").innerHTML = "";
                document.getElementById("username").value = "";
                document.getElementById("passwd").value = "";                                   
            },2000);
    }
}

如果有人指出哪里做得不对,我将不胜感激,谢谢。

【问题讨论】:

  • 因为只有在不匹配的情况下才应该运行代码。一旦代码失败,您就运行代码。
  • if (username != '' || passwd != ''){你不想if (username != '' &amp;&amp; passwd != ''){
  • 您正在检查以确保输入与所有用户匹配。您需要用查找用户的方法替换 for 循环,然后只检查该用户的密码。

标签: javascript html json if-statement authentication


【解决方案1】:

假设输入了正确的组合,for循环进入if-part匹配用户一次,但进入@ 987654324@-part 适用于所有其他不匹配的用户。没有任何措施可以防止这种情况发生。

您需要确定谁是匹配的人如果有,然后继续处理该结果(可能是用户对象,或undefined)。

您可以通过find 这样做,使用如下代码:

var matchingUser = objPeople.find(p => username === p.username && passwd === p.passwd);
if (matchingUser) {
   // ...
} else {
   // ...
}

旁注 - 我使用了“三等号”,它在对象之间进行精确比较,没有任何可能妨碍的类型转换。

【讨论】: