简体   繁体   中英

Combining these two functions into one

Hey guys I have a password validator that I amd having issues working on, its quite lengthy and I think can be shortened down and simplified if possible.

Could someone assist me in simplifying it. Im talking about the checkValidPassword() function.

function check(input) {
    if (input.value != document.getElementById('password').value) {
        input.setCustomValidity('Password Must be Matching.');
    } else {
        // input is valid -- reset the error message
        input.setCustomValidity('');
        // check the length of the password
        checkValidPassword(input);
    }
}


function checkValidPassword(input) {
    var password = document.getElementById('password');
    var confirm_password = document.getElementById('confirm password');
    if (password.value.length < 8) {
        password.setCustomValidity('Password must contain at least 8 characters!');
    } else {
        var re = /[0-9]/;
        if (!re.test(password.value)) {
            password.setCustomValidity('password must contain at least one number (0-9)!');
        } else {
            password.setCustomValidity("");
        }
    }
}

And im trying to implement a way for the user to must include atleast a number also. I was thinking about

str.match(/^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])([a-zA-Z0-9]{8,})$/)

Would I include that in the if statment with $$ to symbolize and also check characters ?

if(password.value.length < 8 && str.match(/^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])([a-zA-Z0-9]{8,})$/)) {

This is essentially a code review question, but ok... I'd rewrite your function to something like:

function checkPassword() {

    var password = document.getElementById('password');
    var confirm_password = document.getElementById('confirm password');

    if (password.value != confirm_password.value) {
        password.setCustomValidity('Password Must be Matching.');
        return false;
    }

    if(password.value.length < 8 ) {
        password.setCustomValidity('Password must contain at least 8 characters!');
        return false;
    }

    if(!/[0-9]/.test(password.value)) {
        password.setCustomValidity('password must contain at least one number (0-9)!');
        return false;
    }

    return true;
}

Basically, check each condition individually and return immediately if it fails, thus avoiding extra indentation ("early exits"). This is a bit verbose, but far more readable than a monster regular expression, especially if you don't know for sure what it does.

I managed to figure it out, I combined them both by just putting the else into one another.

function ValidatePassword(pass, confirm_pass) {
    if (pass.value != confirm_pass.value || pass.value == "" || confirm_pass.value == "") {
        confirm_pass.setCustomValidity("the Passwords do not match");
        pass.setCustomValidity("the Passwords do not match");
    } else {
      if(pass.value.match(/(?=^.{8,30}$)([a-zA-Z]+[0-9])$/)) {

            pass.setCustomValidity("");
            confirm_pass.setCustomValidity("");


        } else {
             pass.setCustomValidity("the password doesnt have numbers");
            confirm_pass.setCustomValidity("the password doesnt have numbers");
        }
    }
}

Here is what I made the form look like:

<form>

        password
        <input id="pass" type="password" required="" placeholder="Password" />
        <br> confirm
        <input id="confirm_pass" type="password" required="" placeholder="confirm" onfocus="ValidatePassword(document.getElementById('pass'), this);" oninput="ValidatePassword(document.getElementById('pass'), this);" />
        <br> username :
        <input id="username" required="" type="text">
        <br>
        <button class="btnform" name="register" type="submit">Complete Registration</button>
</form>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM