我的密码生成器输出不如预期。

3

我正在尝试制作一个密码生成器用于编码训练营,但我遇到了一个问题,有两种结果都不是我想要的。HTML非常基础,而我应该使用提示框进行选择。我包含了我的代码,但去掉了一些不必要的东西、另外14个if-else语句和一些变量。即使格式很难看,还是要提交这个项目,但我仍然想知道我错在哪里。这两个结果是:

  1. 选择将不会是唯一的,而是反复使用相同的字符。
  2. 它看起来很松散,并加入了空格。
function randomLower() {
  return String.fromCharCode(Math.floor(Math.random() * 26) + 97);
}
//random uppercase from character code
function randomUpper() {
  return String.fromCharCode(Math.floor(Math.random() * 26) + 65);
}
//random number from character code
function randomNumber() {
  return String.fromCharCode(Math.floor(Math.random() * 10) + 48);
}
// random symbol from character code
function randomSymbol() {
  let symbol = "!@#$%^&*()_-><[]}{";
  return symbol[Math.floor(Math.random() * symbol.length)];
}

// Get references to the #generate element
var generateBtn = document.querySelector("#generate");

// 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);

// function for generatePassword
function generatePassword() {
  //Confirms # of characters needed
  click = parseInt(prompt("How many characters?", "8-128"));
  if (!click) {
    alert("Input is needed");
    //Ensures the character count isn't too high or low
  } else if (click < 8 || click > 128) {
    click = parseInt(prompt("Answer must be between 8 and 128"));
  } else {
    //The procedding few lines will confirm other variables
    useNumbers = confirm("Include numbers?");
    useLower = confirm("Include lowercase letters?");
    useUpper = confirm("Include uppercase letters?");
    useSymbol = confirm("Include special characters?");
  }
  //If all prompts are denied
  if (!useLower && !useUpper && !useNumbers && !useSymbol) {
    choices = alert("At least one option is needed");
    //If all prompts are accepted
  } else if (useLower && useUpper && useNumbers && useSymbol) {
    choices = randomLower().concat(randomUpper, randomNumber, randomSymbol);
//code only makes repeating characters
//choices = randomLower().concat(randomUpper(), randomNumber(), randomSymbol())
  
//placeholder for an array for user choices
  var pWord = [];
  //for loop to randomize selection
  for (let i = 0; i < click; i++) {
    var selected = choices[Math.floor(Math.random() * choices.length)];
    pWord.push(selected);
  }

  //.join will take all choices in the array pWord and turns it into a string
  var pass = pWord.join("");
  UserInput(pass);
  return pass;
}
// This puts the new password into the textbox
function UserInput(pass) {
  document.getElementById("password").value = pass;
}

1
你应该查看choices的值。它不是你想象的那样。 - Barmar
我尝试保持一切不变,只是将“randomUpper Lower Symbol Number”函数更改为“var randomLower = function”,但没有成功。然后我尝试从concat更改为使用+运算符,但也没有解决问题。不过我很快就有导师预约了。感谢您的建议! - Codeyg12
你没有调用 randomUpper()randomNumber()randomSymbol()。你需要在它们后面加上 () - Barmar
只有在要求所有类型时,您才设置“choices”。 - Barmar
你在 else if (useLower && useUpper && useNumbers && useSymbol) { 结尾缺少 } - Barmar
2个回答

1
  • 只有在用户选择所有选项时才设置choices
  • 当您设置choices时,不要调用concat()参数中的函数。因此,您是将函数定义连接在一起,而不是将函数返回的随机字母连接在一起。
  • 即使您修复了调用函数的问题,也只会获得4个字符。您需要在生成每个字符的循环中调用randomXXX函数。

在我的代码中,我已经将choices设置为一个函数数组,而不是字符。我根据提示条件性地将每个函数添加到数组中。然后,循环首先随机选择一个函数,并调用它以获取该类型的随机字符。

// function for generatePassword
function generatePassword() {
  //Confirms # of characters needed
  let click = parseInt(prompt("How many characters?", "8-128"));
  let choices = [];
  if (!click) {
    alert("Input is needed");
    //Ensures the character count isn't too high or low
  } else if (click < 8 || click > 128) {
    click = parseInt(prompt("Answer must be between 8 and 128"));
  } else {
    //The procedding few lines will confirm other variables
    if (confirm("Include numbers?")) {
      choices.push(randomNumber);
    }
    if (confirm("Include lowercase letters?")) {
      choices.push(randomLower);
    }
    if (confirm("Include uppercase letters?")) {
      choices.push(randomUpper);
    }
    if (confirm("Include special characters?")) {
      choices.push(randomSymbol);
    }
  }
  //If all prompts are denied
  if (choices.length == 0) {
    alert("At least one option is needed");
    return;
  }

  //placeholder for an array for user choices
  var pWord = [];
  //for loop to randomize selection
  for (let i = 0; i < click; i++) {
    let selected = choices[Math.floor(Math.random() * choices.length)];
    pWord.push(selected());
  }

  //.join will take all choices in the array pWord and turns it into a string
  var pass = pWord.join("");
  return pass;
}

console.log(generatePassword());

function randomLower() {
  return String.fromCharCode(Math.floor(Math.random() * 26) + 97);
}
//random uppercase from character code
function randomUpper() {
  return String.fromCharCode(Math.floor(Math.random() * 26) + 65);
}
//random number from character code
function randomNumber() {
  return String.fromCharCode(Math.floor(Math.random() * 10) + 48);
}
// random symbol from character code
function randomSymbol() {
  let symbol = "!@#$%^&*()_-><[]}{";
  return symbol[Math.floor(Math.random() * symbol.length)];
}


0

我正在按照密码生成器网站的相同模式进行编写。您可以将此JavaScript添加到您的HTML中。使用以下代码,您可以在JavaScript中生成随机字母数字字符串:

function generateRandomString(length) {
  var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz";
  var string_length = length || 8;
  var randomstring = '';
  for (var i=0; i<string_length; i++) {
    var rnum = Math.floor(Math.random() * chars.length);
    randomstring += chars.substring(rnum,rnum+1);
  }
  return randomstring;
}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接