小影志 大神 , 随机密码生成器

今天突然想弄个,纯前端生成密码的脚本。
找着找着找到了,小影志大神 分享到工具箱。
果断收藏起来,并扒下代码准备学习一下。感谢大神的分享。

看着大神 - 随机密码生成器 - 原生js脚本,很精炼;
让我找到了,最初接触js脚本,为它的灵活着迷的感觉;
感觉自己还是好渣渣。

跳转至 小影志 大神 网站

html,js的源码 (样式不粘贴了)

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
  </head>
  <body>
    <form id="main" class="pure-form">
      <ul>
        <li><label><input type="checkbox" name="include_number" checked /><span>数字</span></label></li>
        <li><label><input type="checkbox" name="include_lowercaseletters" checked /><span>小写字母</span></label></li>
        <li><label><input type="checkbox" name="include_uppercaseletters" checked /><span>大写字母</span></label></li>
        <li><label><span>特殊符号</span><input type="text" name="special_characters" placeholder="输入需要添加的特殊符号" /></label></li>
        <li><label><span>排除字符</span><input type="text" name="exclude_characters" placeholder="比如:i, l, 1, L, o, 0, O" /></label></li>
        <li><label><input type="checkbox" name="password_unique" /><span>字符不重复</span></label></li>
        <li><label><span>密码长度</span><input type="number" name="password_length" min="0" value="8" /></label></li>
        <li><label><span>密码数量</span><input type="number" name="password_quantity" min="0" value="1" /></label></li>
      </ul>
      <button type="button" id="generate" class="pure-button pure-button-primary pure-input-1">生成密码</button>
      <textarea name="output" class="pure-input-1" cols="40" rows="7" readonly></textarea>
    </form>
    <script>
      // 表单
      var form = document.getElementById('main');

      // 随机数
      function rand(max) {
        return Math.floor(Math.random() * max);
      }

      // 随机密码生成器
      // 原生js 表单内通过name去寻找Element
      document.getElementById('generate').onclick = function() {
        var chars = ''; // 密码可包含的文字
        var passwords = []; // 密码列表
        var passwordUnique = form.password_unique.checked; // 字符是否重复
        var quantity = Number(form.password_quantity.value); // 生成密码数量

        if (form.include_number.checked) chars += '0123456789'; // 0-9
        if (form.include_lowercaseletters.checked) chars += 'abcdefghijklmnopqrstuvwxyz'; // a-z
        if (form.include_uppercaseletters.checked) chars += 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; // A-Z
        if (form.special_characters.value) chars += form.special_characters.value; // 允许的特殊符号
        if (form.exclude_characters.value) chars = chars.replace(new RegExp(form.exclude_characters.value.split('').join(
          '|'), 'g'), ''); // 排除某些文字

        while (passwords.length < quantity) {
          var _chars = chars.split('');
          var password = '';

          for (var i = 0, l = form.password_length.value; i < l; i++) {
            if (_chars.length < 1) break; // 密码不能包含任何文字 直接跳出

            var idx = rand(_chars.length);
            password += _chars[idx];
            if (passwordUnique) _chars.splice(idx, 1);
          }

          if (passwords.indexOf(password) === -1) passwords.push(password); // 当前生成的密码与之前不同时,添加至密码列表
        }

        form.output.value = passwords.join('\n'); // 输出生成的密码列表
      };

      // 很人性化的交互; 获取光标就,自动全选
      form.output.onfocus = function() {
        this.select();
      };

      // 加载 随机生成密码要求
      function loadConfig() {
        var config = JSON.parse(localStorage.getItem('passwordConfig'));

        // https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
        // Object.keys 返回的是 string[]
        Object.keys(config).forEach(function(name) {
          var value = config[name];
          var input = form[name];

          if (input.type === 'checkbox') {
            input.checked = value;
          } else {
            input.value = value;
          }
        });
      }

      // 保存 当前随机生成密码的要求
      function saveConfig() {
        var config = {};

        // https://developer.mozilla.org/zh-CN/docs/Web/API/Document/getElementsByTagName
        // getElementsByTagName 返回的 HTML集合 ;根据上面API的介绍,存在浏览器兼容问题 (浏览器返回类型不一致)
        // 此刻[].forEach充当迭代器的作用
        [].forEach.call(form.getElementsByTagName('input'), function(input) {
          // 读取input的值
          //  是 复选框 => 获取 checked 属性
          //  非 复选框 => 获取 value 属性
          config[input.name] = input.type === 'checkbox' ? input.checked : input.value;
        });

        // 本地永久缓存 密码配置信息
        localStorage.setItem('passwordConfig', JSON.stringify(config));
      }

      [].forEach.call(form.getElementsByTagName('input'), function(input) {
        // 监听 input 标签变更事件
        input.addEventListener('change', saveConfig);
      });

      // 如果存在密码配置信息,就读取
      if (localStorage.getItem('passwordConfig')) {
        loadConfig();
      }
    </script>
  </body>
</html>

小影志 大神分享的网页工具箱