Best JavaScript Password Generation

JavaScript Password Generation

Secure Password Generation Using JavaScript: Strengthen Your Online Security

Password Generator – JS projects

Copied to clipboard

Password Generator

Generate a secure password

Customize password

Password length : 20


In the digital age, maintaining strong online security is paramount to protect sensitive information from malicious attacks. One of the fundamental aspects of online security is using strong, unique passwords for different accounts. However, creating such passwords manually can be challenging and time-consuming. This is where JavaScript-powered password generators come to the rescue. In this blog post, we will explore the importance of password generators, their benefits, and how to develop a secure password generator using JavaScript.

Why Use a Password Generator?

Creating strong passwords manually is not an easy task, as they require a combination of uppercase and lowercase letters, numbers, and special characters. Moreover, it is recommended to have unique passwords for each online account to prevent a single breach compromising multiple accounts. This is where password generators can be incredibly helpful. Password generators automate the process of generating strong, random passwords that meet the necessary complexity requirements. By using a password generator, you can save time, improve security, and reduce the risk of unauthorized access to your accounts.

Benefits of Using JavaScript for Password Generation

JavaScript is a versatile programming language that runs directly in web browsers, making it an ideal choice for implementing password generators. Here are some key benefits of using JavaScript for password generation:

  1. Client-side Execution: JavaScript code runs on the client-side, within the user’s browser, ensuring that sensitive data, such as the generated password, never leaves the user’s device. This adds an extra layer of security by reducing the exposure of the password to potential vulnerabilities during transmission.

  2. Ease of Use: JavaScript is a beginner-friendly language, and many web developers are already familiar with it. Its simplicity and widespread adoption make it accessible for developers to create password generators without requiring extensive programming knowledge.

  3. Interactive User Experience: With JavaScript, password generators can provide an interactive user experience by allowing users to customize password length, character types, and even pronounceability. This flexibility enhances user satisfaction and usability.

Developing a Secure Password Generator Using JavaScript

To create a secure password generator using JavaScript, you need to consider a few essential aspects. Let’s walk through the steps involved:

  1. Defining Password Complexity: Determine the complexity requirements for the generated passwords. This may include specifying the minimum and maximum length, character types (uppercase, lowercase, numbers, special characters), and any additional constraints.

  2. Generating Random Characters: JavaScript provides various methods for generating random characters. You can utilize these functions to build a pool of characters based on the chosen complexity requirements.

  3. Assembling the Password: Using the generated characters, concatenate and shuffle them to form the final password string. Ensure that the password meets the defined complexity criteria.

  4. User Interaction: Implement a user-friendly interface that allows users to customize the password length, character types, and any other relevant options. Provide clear instructions and feedback to enhance the user experience.

  5. Error Handling and Validation: Validate user inputs, handle potential errors, and provide informative error messages to guide users in case of incorrect inputs or unexpected behavior.

  6. Testing and Security Considerations: Thoroughly test the password generator to ensure its functionality and security. Implement measures to prevent common vulnerabilities such as cross-site scripting (XSS) attacks or insecure randomization algorithms.

Keyword Clusters:

  1. Password generator JavaScript
  2. Secure password generation
  3. JavaScript programming
  4. Online security best practices
  5. Password complexity requirements
  6. User-friendly interface
  7. Error handling and validation
  8. Web application security

In conclusion, utilizing a password generator powered by JavaScript can greatly enhance your online security by providing strong, random passwords tailored to your specific requirements. By following the steps outlined in this blog post, you can develop a secure password generator that ensures your sensitive information remains protected. Remember to stay vigilant in implementing robust security measures and regularly update your passwords to stay one step ahead of potential threats.

Index.html

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

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

<body style="position: relative;">
  <main style="position: relative;">
    <div class="alert" id="alert">
      <span>
        <svg viewBox="0 0 24 24" width="18" height="18" stroke="currentColor" stroke-width="2" fill="none"
          stroke-linecap="round" stroke-linejoin="round" class="css-i6dzq1">
          <path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"></path>
          <polyline points="22 4 12 14.01 9 11.01"></polyline>
        </svg>
      </span>
      <p>Copied to clipboard</p>
    </div>
    <section class="generator">
      <div class="generator-intro">
        <h3>Password Generator</h3>
        <h2>Generate a secure password</h2>
      </div>
      <div class="generator-box">
        <div class="generated-password">
          <input type="text" placeholder="Generated password here" id="password">
          <button id="clipboard">
            <svg viewBox="0 0 24 24" width="26" height="26" stroke="currentColor" stroke-width="2" fill="none"
              stroke-linecap="round" stroke-linejoin="round" class="css-i6dzq1">
              <rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect>
              <path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path>
            </svg>
          </button>
          
        </div>
        <div class="password-settings">
          <h2>Customize password</h2>
          <div class="settings-panel">
            <div class="password-lenght">
              <p>Password length : <span id="lengthValue">20</span></p>
              <input type="range" name="length" id="length" class="slider" min="5" max="40" value="20">
            </div>
            <div class="compose-password">
              <div class="checkbox">
                <input type="checkbox" name="uppercase" id="uppercase" checked>
                <label for="">Uppercase Letters</label>
              </div>
              <div class="checkbox">
                <input type="checkbox" name="lowercase" id="lowercase" checked>
                <label for="">Lowercase Letters</label>
              </div>
              <div class="checkbox">
                <input type="checkbox" name="symbols" id="symbols" checked>
                <label for="">Symbols</label>
              </div>
              <div class="checkbox">
                <input type="checkbox" name="numbers" id="numbers" checked>
                <label for="">Numbers</label>
              </div>
            </div>
          </div>
        </div>
      </div>
    </section>
  </main>
  <footer>
  </footer> <script data-no-optimize="1">!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).LazyLoad=e()}(this,function(){"use strict";function e(){return(e=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n,a=arguments[e];for(n in a)Object.prototype.hasOwnProperty.call(a,n)&&(t[n]=a[n])}return t}).apply(this,arguments)}function i(t){return e({},it,t)}function o(t,e){var n,a="LazyLoad::Initialized",i=new t(e);try{n=new CustomEvent(a,{detail:{instance:i}})}catch(t){(n=document.createEvent("CustomEvent")).initCustomEvent(a,!1,!1,{instance:i})}window.dispatchEvent(n)}function l(t,e){return t.getAttribute(gt+e)}function c(t){return l(t,bt)}function s(t,e){return function(t,e,n){e=gt+e;null!==n?t.setAttribute(e,n):t.removeAttribute(e)}(t,bt,e)}function r(t){return s(t,null),0}function u(t){return null===c(t)}function d(t){return c(t)===vt}function f(t,e,n,a){t&&(void 0===a?void 0===n?t(e):t(e,n):t(e,n,a))}function _(t,e){nt?t.classList.add(e):t.className+=(t.className?" ":"")+e}function v(t,e){nt?t.classList.remove(e):t.className=t.className.replace(new RegExp("(^|\\s+)"+e+"(\\s+|$)")," ").replace(/^\s+/,"").replace(/\s+$/,"")}function g(t){return t.llTempImage}function b(t,e){!e||(e=e._observer)&&e.unobserve(t)}function p(t,e){t&&(t.loadingCount+=e)}function h(t,e){t&&(t.toLoadCount=e)}function n(t){for(var e,n=[],a=0;e=t.children[a];a+=1)"SOURCE"===e.tagName&&n.push(e);return n}function m(t,e){(t=t.parentNode)&&"PICTURE"===t.tagName&&n(t).forEach(e)}function a(t,e){n(t).forEach(e)}function E(t){return!!t[st]}function I(t){return t[st]}function y(t){return delete t[st]}function A(e,t){var n;E(e)||(n={},t.forEach(function(t){n[t]=e.getAttribute(t)}),e[st]=n)}function k(a,t){var i;E(a)&&(i=I(a),t.forEach(function(t){var e,n;e=a,(t=i[n=t])?e.setAttribute(n,t):e.removeAttribute(n)}))}function L(t,e,n){_(t,e.class_loading),s(t,ut),n&&(p(n,1),f(e.callback_loading,t,n))}function w(t,e,n){n&&t.setAttribute(e,n)}function x(t,e){w(t,ct,l(t,e.data_sizes)),w(t,rt,l(t,e.data_srcset)),w(t,ot,l(t,e.data_src))}function O(t,e,n){var a=l(t,e.data_bg_multi),i=l(t,e.data_bg_multi_hidpi);(a=at&&i?i:a)&&(t.style.backgroundImage=a,n=n,_(t=t,(e=e).class_applied),s(t,ft),n&&(e.unobserve_completed&&b(t,e),f(e.callback_applied,t,n)))}function N(t,e){!e||0<e.loadingCount||0<e.toLoadCount||f(t.callback_finish,e)}function C(t,e,n){t.addEventListener(e,n),t.llEvLisnrs[e]=n}function M(t){return!!t.llEvLisnrs}function z(t){if(M(t)){var e,n,a=t.llEvLisnrs;for(e in a){var i=a[e];n=e,i=i,t.removeEventListener(n,i)}delete t.llEvLisnrs}}function R(t,e,n){var a;delete t.llTempImage,p(n,-1),(a=n)&&--a.toLoadCount,v(t,e.class_loading),e.unobserve_completed&&b(t,n)}function T(o,r,c){var l=g(o)||o;M(l)||function(t,e,n){M(t)||(t.llEvLisnrs={});var a="VIDEO"===t.tagName?"loadeddata":"load";C(t,a,e),C(t,"error",n)}(l,function(t){var e,n,a,i;n=r,a=c,i=d(e=o),R(e,n,a),_(e,n.class_loaded),s(e,dt),f(n.callback_loaded,e,a),i||N(n,a),z(l)},function(t){var e,n,a,i;n=r,a=c,i=d(e=o),R(e,n,a),_(e,n.class_error),s(e,_t),f(n.callback_error,e,a),i||N(n,a),z(l)})}function G(t,e,n){var a,i,o,r,c;t.llTempImage=document.createElement("IMG"),T(t,e,n),E(c=t)||(c[st]={backgroundImage:c.style.backgroundImage}),o=n,r=l(a=t,(i=e).data_bg),c=l(a,i.data_bg_hidpi),(r=at&&c?c:r)&&(a.style.backgroundImage='url("'.concat(r,'")'),g(a).setAttribute(ot,r),L(a,i,o)),O(t,e,n)}function D(t,e,n){var a;T(t,e,n),a=e,e=n,(t=It[(n=t).tagName])&&(t(n,a),L(n,a,e))}function V(t,e,n){var a;a=t,(-1<yt.indexOf(a.tagName)?D:G)(t,e,n)}function F(t,e,n){var a;t.setAttribute("loading","lazy"),T(t,e,n),a=e,(e=It[(n=t).tagName])&&e(n,a),s(t,vt)}function j(t){t.removeAttribute(ot),t.removeAttribute(rt),t.removeAttribute(ct)}function P(t){m(t,function(t){k(t,Et)}),k(t,Et)}function S(t){var e;(e=At[t.tagName])?e(t):E(e=t)&&(t=I(e),e.style.backgroundImage=t.backgroundImage)}function U(t,e){var n;S(t),n=e,u(e=t)||d(e)||(v(e,n.class_entered),v(e,n.class_exited),v(e,n.class_applied),v(e,n.class_loading),v(e,n.class_loaded),v(e,n.class_error)),r(t),y(t)}function $(t,e,n,a){var i;n.cancel_on_exit&&(c(t)!==ut||"IMG"===t.tagName&&(z(t),m(i=t,function(t){j(t)}),j(i),P(t),v(t,n.class_loading),p(a,-1),r(t),f(n.callback_cancel,t,e,a)))}function q(t,e,n,a){var i,o,r=(o=t,0<=pt.indexOf(c(o)));s(t,"entered"),_(t,n.class_entered),v(t,n.class_exited),i=t,o=a,n.unobserve_entered&&b(i,o),f(n.callback_enter,t,e,a),r||V(t,n,a)}function H(t){return t.use_native&&"loading"in HTMLImageElement.prototype}function B(t,i,o){t.forEach(function(t){return(a=t).isIntersecting||0<a.intersectionRatio?q(t.target,t,i,o):(e=t.target,n=t,a=i,t=o,void(u(e)||(_(e,a.class_exited),$(e,n,a,t),f(a.callback_exit,e,n,t))));var e,n,a})}function J(e,n){var t;et&&!H(e)&&(n._observer=new IntersectionObserver(function(t){B(t,e,n)},{root:(t=e).container===document?null:t.container,rootMargin:t.thresholds||t.threshold+"px"}))}function K(t){return Array.prototype.slice.call(t)}function Q(t){return t.container.querySelectorAll(t.elements_selector)}function W(t){return c(t)===_t}function X(t,e){return e=t||Q(e),K(e).filter(u)}function Y(e,t){var n;(n=Q(e),K(n).filter(W)).forEach(function(t){v(t,e.class_error),r(t)}),t.update()}function t(t,e){var n,a,t=i(t);this._settings=t,this.loadingCount=0,J(t,this),n=t,a=this,Z&&window.addEventListener("online",function(){Y(n,a)}),this.update(e)}var Z="undefined"!=typeof window,tt=Z&&!("onscroll"in window)||"undefined"!=typeof navigator&&/(gle|ing|ro)bot|crawl|spider/i.test(navigator.userAgent),et=Z&&"IntersectionObserver"in window,nt=Z&&"classList"in document.createElement("p"),at=Z&&1<window.devicePixelRatio,it={elements_selector:".lazy",container:tt||Z?document:null,threshold:300,thresholds:null,data_src:"src",data_srcset:"srcset",data_sizes:"sizes",data_bg:"bg",data_bg_hidpi:"bg-hidpi",data_bg_multi:"bg-multi",data_bg_multi_hidpi:"bg-multi-hidpi",data_poster:"poster",class_applied:"applied",class_loading:"litespeed-loading",class_loaded:"litespeed-loaded",class_error:"error",class_entered:"entered",class_exited:"exited",unobserve_completed:!0,unobserve_entered:!1,cancel_on_exit:!0,callback_enter:null,callback_exit:null,callback_applied:null,callback_loading:null,callback_loaded:null,callback_error:null,callback_finish:null,callback_cancel:null,use_native:!1},ot="src",rt="srcset",ct="sizes",lt="poster",st="llOriginalAttrs",ut="loading",dt="loaded",ft="applied",_t="error",vt="native",gt="data-",bt="ll-status",pt=[ut,dt,ft,_t],ht=[ot],mt=[ot,lt],Et=[ot,rt,ct],It={IMG:function(t,e){m(t,function(t){A(t,Et),x(t,e)}),A(t,Et),x(t,e)},IFRAME:function(t,e){A(t,ht),w(t,ot,l(t,e.data_src))},VIDEO:function(t,e){a(t,function(t){A(t,ht),w(t,ot,l(t,e.data_src))}),A(t,mt),w(t,lt,l(t,e.data_poster)),w(t,ot,l(t,e.data_src)),t.load()}},yt=["IMG","IFRAME","VIDEO"],At={IMG:P,IFRAME:function(t){k(t,ht)},VIDEO:function(t){a(t,function(t){k(t,ht)}),k(t,mt),t.load()}},kt=["IMG","IFRAME","VIDEO"];return t.prototype={update:function(t){var e,n,a,i=this._settings,o=X(t,i);{if(h(this,o.length),!tt&&et)return H(i)?(e=i,n=this,o.forEach(function(t){-1!==kt.indexOf(t.tagName)&&F(t,e,n)}),void h(n,0)):(t=this._observer,i=o,t.disconnect(),a=t,void i.forEach(function(t){a.observe(t)}));this.loadAll(o)}},destroy:function(){this._observer&&this._observer.disconnect(),Q(this._settings).forEach(function(t){y(t)}),delete this._observer,delete this._settings,delete this.loadingCount,delete this.toLoadCount},loadAll:function(t){var e=this,n=this._settings;X(t,n).forEach(function(t){b(t,e),V(t,n,e)})},restoreAll:function(){var e=this._settings;Q(e).forEach(function(t){U(t,e)})}},t.load=function(t,e){e=i(e);V(t,e)},t.resetStatus=function(t){r(t)},Z&&function(t,e){if(e)if(e.length)for(var n,a=0;n=e[a];a+=1)o(t,n);else o(t,e)}(t,window.lazyLoadOptions),t});!function(e,t){"use strict";function a(){t.body.classList.add("litespeed_lazyloaded")}function n(){console.log("[LiteSpeed] Start Lazy Load Images"),d=new LazyLoad({elements_selector:"[data-lazyloaded]",callback_finish:a}),o=function(){d.update()},e.MutationObserver&&new MutationObserver(o).observe(t.documentElement,{childList:!0,subtree:!0,attributes:!0})}var d,o;e.addEventListener?e.addEventListener("load",n,!1):e.attachEvent("onload",n)}(window,document);</script><script data-optimized="1" type="litespeed/javascript" data-src="https://dailywebdesigns.com/wp-content/litespeed/js/7e7fce662c84e1ba3ba64207495bfb23.js?ver=0b80d"></script><script>const litespeed_ui_events=["mouseover","click","keydown","wheel","touchmove","touchstart"];var urlCreator=window.URL||window.webkitURL;function litespeed_load_delayed_js_force(){console.log("[LiteSpeed] Start Load JS Delayed"),litespeed_ui_events.forEach(e=>{window.removeEventListener(e,litespeed_load_delayed_js_force,{passive:!0})}),document.querySelectorAll("iframe[data-litespeed-src]").forEach(e=>{e.setAttribute("src",e.getAttribute("data-litespeed-src"))}),"loading"==document.readyState?window.addEventListener("DOMContentLoaded",litespeed_load_delayed_js):litespeed_load_delayed_js()}litespeed_ui_events.forEach(e=>{window.addEventListener(e,litespeed_load_delayed_js_force,{passive:!0})});async function litespeed_load_delayed_js(){let t=[];for(var d in document.querySelectorAll('script[type="litespeed/javascript"]').forEach(e=>{t.push(e)}),t)await new Promise(e=>litespeed_load_one(t[d],e));document.dispatchEvent(new Event("DOMContentLiteSpeedLoaded")),window.dispatchEvent(new Event("DOMContentLiteSpeedLoaded"))}function litespeed_load_one(t,e){console.log("[LiteSpeed] Load ",t);var d=document.createElement("script");d.addEventListener("load",e),d.addEventListener("error",e),t.getAttributeNames().forEach(e=>{"type"!=e&&d.setAttribute("data-src"==e?"src":e,t.getAttribute(e))});let a=!(d.type="text/javascript");!d.src&&t.textContent&&(d.src=litespeed_inline2src(t.textContent),a=!0),t.after(d),t.remove(),a&&e()}function litespeed_inline2src(t){try{var d=urlCreator.createObjectURL(new Blob([t.replace(/^(?:<!--)?(.*?)(?:-->)?$/gm,"$1")],{type:"text/javascript"}))}catch(e){d="data:text/javascript;base64,"+btoa(t.replace(/^(?:<!--)?(.*?)(?:-->)?$/gm,"$1"))}return d}</script></body>

</html>
				
			

style.css

				
					@import url('https://fonts.googleapis.com/css2?family=Outfit:wght@100..900&display=swap');

/* Custom properties */
:root {
  --cl-black: #161718;
  --cl-white: #ffffff;
  --cl-accent: #13f0ae;
  --fs-3xl: 5rem;
  --fs-2xl: 3.2rem;
  --fs-xl: 2.8rem;
  --fs-lg: 2.2rem;
  --fs-md: 1.8rem;
  --fs-base: 1.6rem;
  --fs-sm: 1.4rem;
  --fs-xs: 1.2rem;
  --font-family: 'Outfit', sans-serif;
}

/* Reset */
*,
*::before,
*::after {
  box-sizing: border-box;
}

body,
h1,
h2,
h3,
h4,
h5,
p,
figure,
picture {
  margin: 0;
}

img {
  max-width: 100%;
  display: block;
}

html {
  font-size: 62.5%;
}

body {
  background-color: var(--cl-black);
  color: var(--cl-white);
  line-height: 1.5;
  min-height: 100vh;
  font-family: var(--font-family);
  font-size: var(--fs-base);
  letter-spacing: normal;
  user-select: none;
}

h1,
h2,
h3,
h4,
h5 {
  font-weight: 400;
}

input,
button,
textarea,
select {
  font: inherit;
}

.alert {
  display: flex;
  align-items: center;
  gap: 1rem;
  position: absolute;
  top: 4rem;
  left: 50%;
  right: 50%;
  transform: translateX(-50%) translateY(-300%);
  width: fit-content;
  padding: 0.7rem 1.4rem;
  background-color: var(--cl-black);
  color: var(--cl-accent);
  border: 1px solid var(--cl-accent);
  font-size: var(--fs-sm);
  font-weight: 500;
  border-radius: 0.6rem;
  transition: transform 400ms ease-in-out;
}

.alert span svg {
  vertical-align: middle;
}

.alert.active {
  transform: translateX(-50%) translateY(0);
}

.generator {
  max-width: 80rem;
  height: 100vh;
  margin-inline: auto;
  padding-inline: 1.5rem;
  display: flex;
  align-items: center;
  justify-content: center;
  flex-direction: column;
}

.generator-intro {
  text-align: center;
  margin-bottom: 4rem;
  font-weight: 600;
}
.generator-intro h2 {
  font-size: clamp(var(--fs-2xl), 6vw, var(--fs-3xl));
}
.generator-intro h3 {
  color: var(--cl-accent);
  font-size: var(--fs-base);
  text-transform: uppercase;
}

.generator-box {
  width: 100%;
  display: flex;
  align-items: center;
  flex-direction: column;
  gap: 3rem;
}

.generator-box > * {
  width: 100%;
}

.generated-password {
  /* height: 10.5rem; */
  padding: 2.2rem;
  box-shadow: 0 0px 3px rgba(255, 255, 255, 0.1);
  border-top-left-radius: 0.6rem;
  border-top-right-radius: 0.6rem;
  border-bottom: 2px solid var(--cl-accent);
  display: flex;
  align-items: center;
  gap: 1rem;
}
.generated-password > input {
  width: 100%;
  padding: 0.5rem 1rem;
  background-color: var(--cl-black);
  border: none;
  outline: none;
  color: var(--cl-white);
  font-size: var(--fs-lg);
}

.generated-password button {
  background-color: transparent;
  border: none;
  outline: none;
  cursor: pointer;
}
.generated-password button svg {
  color: var(--cl-white);
  opacity: 0.7;
  transition: all 300ms ease-in-out;
}
.generated-password button:hover svg {
  opacity: 1;
}

.password-settings {
  width: 100%;
  display: flex;
  flex-direction: column;
  gap: 2rem;
  padding: 2.2rem;
  box-shadow: 0 0px 3px rgba(255, 255, 255, 0.1);
  border-radius: 0.6rem;
}

.settings-panel {
  display: flex;
  gap: 2rem;
}

.settings-panel > div {
  flex: 1;
}

.password-lenght .slider {
  margin: 0;
  margin-top: 2rem;
  -webkit-appearance: none;
  appearance: none;
  width: 20rem;
  height: 0.4rem;
  background-color: var(--cl-accent);
  border-radius: 0.6rem;
}
.slider::-webkit-slider-thumb {
  -webkit-appearance: none;
  appearance: none;
  width: 1.5rem;
  height: 1.5rem;
  background: var(--cl-accent);
  cursor: pointer;
  border-radius: 50%;
}

.slider::-moz-range-thumb {
  width: 1.5rem;
  height: 1.5rem;
  background: var(--cl-black);
  cursor: pointer;
  border-radius: 50%;
}

.checkbox label {
  font-weight: 300;
}

footer {
  position: absolute;
  bottom: 4rem;
  width: 100%;
  display: flex;
  justify-content: center;
}

footer p {
  color: var(--cl-accent);
  text-align: center;
  font-size: var(--fs-xs);
  font-weight: 600;
}
				
			

main.js

				
					const NUMBERS = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
const LETTERS = [...Array(26)].map((_, i) => String.fromCharCode(i + 65));
const SYMBOLS = ['*', '#', '?', '^', '$', '%', '&', '{', '}', '[', ']', '~'];

const lengthRange = document.getElementById('length');
const lengthValueSpan = document.getElementById('lengthValue');
const passwordInput = document.getElementById('password');
const clipBoardButton = document.getElementById('clipboard');
const clipboardAlert = document.getElementById('alert');

const footerElement = document.querySelector('footer');
footerElement.innerHTML = `<p>Copyright &copy; Dailywebdesign ${new Date().getFullYear()}</p>`;

let state = {
  numbers: true,
  lowercase: true,
  uppercase: true,
  symbols: true,
  passwordLength: 20,
};

document.addEventListener('DOMContentLoaded', () => {
  if (typeof generatePassword !== 'undefined') {
    generatePassword();
  }
});

const copyToClipboard = async () => {
  if (navigator.clipboard) {
    await navigator.clipboard.writeText(passwordInput.value);
    clipboardAlert.classList.add('active');
    clipBoardButton.setAttribute('disabled', true);

    setTimeout(() => {
      clipboardAlert.classList.remove('active');
      clipBoardButton.removeAttribute('disabled');
    }, 4000);
  }
};
clipBoardButton.addEventListener('click', copyToClipboard);

const allCheckBoxes = [...document.querySelectorAll('input[type="checkbox"]')];
allCheckBoxes.forEach((input) => {
  input.addEventListener('change', (e) => {
    state = { ...state, [e.target.id]: e.target.checked };
    generatePassword();
  });
});

lengthRange.addEventListener('input', (e) => {
  lengthValueSpan.innerText = e.target.value;
  state = { ...state, passwordLength: e.target.value };
  generatePassword();
});

const generatePassword = () => {
  let finalPassword = '';
  const availableCharacters = [
    ...(state.numbers ? NUMBERS : []),
    ...(state.uppercase ? LETTERS : []),
    ...(state.lowercase ? LETTERS.map((letter) => letter.toLowerCase()) : []),
    ...(state.symbols ? SYMBOLS : []),
  ];

  for (let i = 0; i < state.passwordLength; i++) {
    const randomIndex = Math.floor(Math.random() * availableCharacters.length);
    finalPassword += availableCharacters[randomIndex];
  }

  passwordInput.value = finalPassword;
};
				
			

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top