javascript - 未定义的 JS 密码生成器

标签 javascript

我正在制作一个简单的密码生成器,提示用户输入密码条件,例如大小写、符号和数字,然后在单击时生成密码。

我已经设置了处理这些问题的函数,但是无法获取实际生成的密码。

我收到错误,生成的密码未定义?

//Password option input
const resultEl = document.getElementById("result");
var characters = prompt("How many characters should the password containt (8-128)");
var upperCase = prompt("Should the password contain uppercase Letters?");
var lowerCase = prompt("Should the password contain lowercase Letters");
var numbers = prompt("Should the password contain numbers?");
var symbols = prompt("Should the password contain symbols?");
var generateEl = document.getElementById("generate");

function randomFunc(input) {
  if (input === "hasUpper") {
    console.log("upper");
    return getRandomUpper();
  }
  if (input === "hasLower") {
    getRandomLower();
    console.log("lower")
  }
  if (input === "hasNumbers") {
    getRandomNumber();
    console.log("numbers")
  }
  if (input === "hasSymbols") {
    getRandomSymbol();
    console.log("symbols")
  }

}


if (characters > 7 && characters < 129) {
  var length = parseInt(characters, 10);
  console.log("length: " + length);
} else {
  var length = false;
  alert("Invalid Password length");
}

// if input is "yes" return true
if (upperCase.toLowerCase() === 'yes') {
  var hasUpper = true;
  console.log("upper: " + hasUpper);
}
if (lowerCase.toLowerCase() === 'yes') {
  var hasLower = true;
  console.log("lower: " + hasLower);
}
if (numbers.toLowerCase() === 'yes') {
  var hasNumbers = true;
  console.log("number: " + hasNumbers);
}
if (symbols.toLowerCase() === 'yes') {
  var hasSymbols = true;
  console.log("symbol: " + hasSymbols);
}


generateEl.addEventListener('click', function() {

  resultEl.innerText = generatePassword(hasUpper, hasLower, hasNumbers, hasSymbols, length);
  console.log("generatebut");

});

//Generate password function
function generatePassword(hasUpper, hasLower, hasNumbers, hasSymbols, length) {
  //1. initialise password variable

  let generatedPassword = '';

  const typesCount = hasUpper + hasLower + hasNumbers + hasSymbols;

  //console.log('typesCount ', typesCount);

  const typesArr = [{
    hasUpper
  }, {
    hasLower
  }, {
    hasNumbers
  }, {
    hasSymbols
  }]

  //3. loop over length call generator function for each type
  for (let i = 0; i < length; i += typesCount) {
    typesArr.forEach(function(type) {
      const funcName = Object.keys(type)[0];
      console.log('funcNames ', funcName);

      generatedPassword = randomFunc(funcName);
    });
  }
  //4. Add final password to password variable and return
  const finalPassword = generatedPassword;
  console.log("password: " + generatedPassword);
  return finalPassword;


}

// Password generator functions

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

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

function getRandomNumber() {
  return String.fromCharCode(Math.floor(Math.random() * 10) + 48);
}

function getRandomSymbol() {
  const symbols = "!@#$%^&*()<>?,."
  return symbols[Math.floor(Math.random() * symbols.length)];
}
<main class="container">
  <header>
    <h1 class="title">Password Generator</h1>
  </header>

  <section class="generator-box">
    <h2 class="sub-title">Generate a Password</h2>
    <div class="pass-div pass-hold">
      <h3>Your secure Password</h3>
      <span id="result"></span>
    </div>
    <section class="button-div">
      <button href="#" class="button" id="generate">Generate</button>
    </section>
  </section>
</main>

最佳答案

  1. randomFunc 函数仅返回“hasUpper”条件的字符。无论大小写,您都需要显式返回一个字符,如下所示:
function randomFunc(input) {
    let randomChar;
    if (input === "hasUpper") {
        randomChar = getRandomUpper();
    }
    if (input === "hasLower") {
        randomChar = getRandomLower();
    }
    if (input === "hasNumbers") {
        randomChar = getRandomNumber();
    }
    if (input === "hasSymbols") {
        randomChar = getRandomSymbol();
    }
    return randomChar;
}
  • generatePassword 函数会在每个循环中覆盖 generatedPassword 变量。因此,即使您从 randomFunc 返回字符,您的最终密码也只会是 1 个字符。我修改了它并删除了多余的 FinalPassword 变量,如下所示:
  • function generatePassword(hasUpper, hasLower, hasNumbers, hasSymbols, length) {
        let generatedPassword = '';
    
        const typesCount = hasUpper + hasLower + hasNumbers + hasSymbols;
    
        const typesArr = [{ hasUpper }, { hasLower }, { hasNumbers }, { hasSymbols }]
    
        for (let i = 0; i < length; i += typesCount) {
            typesArr.forEach(function(type) {
                const funcName = Object.keys(type)[0];
                generatedPassword = generatedPassword + randomFunc(funcName);
            });
        }
    
        return generatedPassword;
    }
    

    关于javascript - 未定义的 JS 密码生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60451955/

    相关文章:

    javascript - 文本区域未被渲染

    javascript - 'await' 即使在异步函数中也不起作用

    javascript - 访问chrome的权限://thumb/*

    javascript - Spring Boot 没有正确加载 CSS 和 JS 文件

    javascript - 具有动态数据的 HighCharts 不起作用

    javascript - 如何使用 JavaScript 保留输入字段中最后存在的文本?

    javascript - 用于防止输入任何与正则表达式不匹配的输入的 jquery 插件

    javascript - 当用户按下提交时停止表单空白

    javascript - 将元素插入两个 Div

    javascript - 如何在vanilla javascript中一个接一个地运行多个计时器函数