Search code examples
javascriptfunctionpasswordsgeneratorprompt

Random password generator javascript not returning password


I'm new to coding and I can't figure out why my JS isn't generating a random password. Click ok through the prompts and you will see the issue I am having. It appears to just be pulling one of my functions in //Generator Functions. I coded the prompts to be very simple since I still don't quite know what I'm doing. I just need it to generate the password for this particular exercise. Any help is appreciated!

// Assignment Code
var generateBtn = document.querySelector("#generate");

// Special characters for the function created
const specialCharacters = "!@#$%^&*()";

// Write password to the #password input
function writePassword() {
  var password = generatePassword();
  var passwordText = document.querySelector("#password");

  passwordText.value = password;

}

// Add event listener to generate button
generateBtn.addEventListener("click", writePassword);

// Prompts that come up after you click generate password
function generatePassword() {
  var passwordLength = prompt("Please enter the number of characters you want for you new password.  It must be more than 12 but less than 128.");

  var numbers = confirm("Do you want numbers in your password?");

  var lowerCases = confirm("Do you want lowercases in your password?");

  var upperCases = confirm("Do you want uppercases in your password?");

  var special = confirm("Do you want special characters in your password?");

  // this is a minimum count for numbers, lowerCases, upperCases & specialCharacters
  var minimumCount = 0;


  // Empty minimums for numbers, lowerCases, upperCases & specialCharacters

  var minimumNumbers = "";
  var minimumLowerCases = "";
  var minimumUpperCases = "";
  var minimumSpecialCharacters = "";


  **// Generator functions**
  var functionArray = [
    function getNumbers() {
      return String.fromCharCode(Math.floor(Math.random() * 10 + 48));
    },

    function getLowerCases() {
      return String.fromCharCode(Math.floor(Math.random() * 26 + 97));
    },

    function getUpperCases() {
      return +String.fromCharCode(Math.floor(Math.random() * 26 + 65));
    },

    function getSpecialCharacters() {
      return specialCharacters(Math.floor(Math.random() * specialCharacters.length));
    }

  ];

  // Checks to make sure user selected ok for all and uses empty minimums from above

  if (numbers === true) {
    minimumNumbers = functionArray[0];
    minimumCount++;

  }

  if (lowerCases === true) {
    minimumLowerCases = functionArray[1];
    minimumCount++;

  }

  if (upperCases === true) {
    minimumUpperCases = functionArray[2];
    minimumCount++;

  }

  if (special === true) {
    minimumSpecialCharacters = functionArray[3];
    minimumCount++;

  }

  // empty string variable for the for loop below
  var randomPasswordGenerated = "";

  // loop getting random characters
  for (let i = 0; i < (parseInt(passwordLength) - minimumCount); i++) {
    var randomNumberPicked = Math.floor(Math.random() * 4);

    randomPasswordGenerated += functionArray[randomNumberPicked]();

  }

  // to make sure characters are added to the password
  randomPasswordGenerated += minimumNumbers;
  randomPasswordGenerated += minimumLowerCases;
  randomPasswordGenerated += minimumUpperCases;
  randomPasswordGenerated += minimumSpecialCharacters;


  return randomPasswordGenerated;

}
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <meta http-equiv="X-UA-Compatible" content="ie=edge" />
  <title>Password Generator</title>
  <link rel="stylesheet" href="style.css" />
</head>

<body>
  <div class="wrapper">
    <header>
      <h1>Password Generator</h1>
    </header>
    <div class="card">
      <div class="card-header">
        <h2>Generate a Password</h2>
      </div>
      <div class="card-body">
        <textarea readonly id="password" placeholder="Your Secure Password" aria-label="Generated Password"></textarea>
      </div>
      <div class="card-footer">
        <button id="generate" class="btn">Generate Password</button>
      </div>
    </div>
  </div>
  <script src="script.js"></script>
</body>

</html>


Solution

  • Firstly, I should say you have syntax error with **// Generator functions**. I have modified your codes a little bit, compare with mine...

    // Special characters for the function created
    const specialCharacters = "!@#$%^&*()";
    const generateButton = document.getElementById('generateBtn')
    generateButton.addEventListener('click', writePassword)
    
    // Write password to the #password input
    function writePassword() {
      var password = generatePassword();
      var passwordText = document.querySelector("#password");
    
      passwordText.value = password;
    
    }
    
    // Prompts that come up after you click generate password
    function generatePassword() {
      var passwordLength = prompt("Please enter the number of characters you want for you new password.  It must be more than 12 but less than 128.");
    
      var numbers = confirm("Do you want numbers in your password?");
    
      var lowerCases = confirm("Do you want lowercases in your password?");
    
      var upperCases = confirm("Do you want uppercases in your password?");
    
      var special = confirm("Do you want special characters in your password?");
    
      // this is a minimum count for numbers, lowerCases, upperCases & specialCharacters
      var minimumCount = 0;
    
    
      // Empty minimums for numbers, lowerCases, upperCases & specialCharacters
    
      var minimumNumbers = "";
      var minimumLowerCases = "";
      var minimumUpperCases = "";
      var minimumSpecialCharacters = "";
    
    
      // Generator functions**
      var functionArray = {
        getNumbers: function() {
          return String.fromCharCode(Math.floor(Math.random() * 10 + 48));
        },
    
        getLowerCases: function() {
          return String.fromCharCode(Math.floor(Math.random() * 26 + 97));
        },
    
        getUpperCases: function() {
          return String.fromCharCode(Math.floor(Math.random() * 26 + 65));
        },
    
        getSpecialCharacters: function() {
          return specialCharacters[Math.floor(Math.random() * specialCharacters.length)]
        }
    
    };
    
      // Checks to make sure user selected ok for all and uses empty minimums from above
    
      if (numbers === true) {
        minimumNumbers = functionArray.getNumbers();
        minimumCount++;
    
      }
    
      if (lowerCases === true) {
        minimumLowerCases = functionArray.getLowerCases();
        minimumCount++;
    
      }
    
      if (upperCases === true) {
        minimumUpperCases = functionArray.getUpperCases();
        minimumCount++;
    
      }
    
      if (special === true) {
        minimumSpecialCharacters = functionArray.getSpecialCharacters();
        minimumCount++;
    
      }
    
      // empty string variable for the for loop below
      var randomPasswordGenerated = "";
    
      // loop getting random characters
      for (let i = 0; i < (parseInt(passwordLength) - minimumCount); i++) {
        var randomNumberPicked = Math.floor(Math.random() * 4);
    
        randomPasswordGenerated += randomNumberPicked;
    
      }
    
      // to make sure characters are added to the password
      randomPasswordGenerated += minimumNumbers;
      randomPasswordGenerated += minimumLowerCases;
      randomPasswordGenerated += minimumUpperCases;
      randomPasswordGenerated += minimumSpecialCharacters;
    
    
      return randomPasswordGenerated;
    
    }
    <div class="wrapper">
        <header>
          <h1>Password Generator</h1>
        </header>
        <div class="card">
          <div class="card-header">
            <h2>Generate a Password</h2>
          </div>
          <div class="card-body">
            <textarea id="password" placeholder="Your Secure Password" aria-label="Generated Password"></textarea>
          </div>
          <div class="card-footer">
            <button id="generateBtn" class="btn">Generate Password</button>
          </div>
        </div>
      </div>