Password Strength Indicator using jQuery

With the advent of new frameworks in web technologies, it has become quite easy to design and implement feature-rich and responsive web pages. Here, we are going to design a password strength indicator using jQuery and Bootstrap for register pages.

Functionality to implement:
A progress bar to represent the strength of the password whenever users add the input to the password input form. The length of the progress bar represents the strength of the password. We are going to implement this on the front-end only.

A valid password has following criteria for evaluation: (to determine % of length contribution)

  • Atleast an uppercase letter (10%), lowercase letter (10%), number (10%), special symbol(10%)
  • The word length criteria:
    • 6 words : 20%
    • 8 words : 40%
    • [10, infinty) words : 60%

Prerequisites:
Basic knowledge of HTML, CSS, JavaScript, jQuery, and Bootstrap. Also, the user should be aware of how the grid system in Bootstrap works.

Procedure:



  1. Initialize the layout:
    First of all, let us initialize the layout of our register page using bootstrap. For the progress bar, we will use progress class for building progress bars from the bootstrap (irrespective of the variant/version of bootstrap used).
  2. filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    <!-- Register page for password strength indicator -->
    <!DOCTYPE html>
    <html lang="en">
      
    <head>
        <meta charset="utf-8" />
        <!-- Required CDN's -->
        <link rel="stylesheet"
              href=
        <script src=
      </script>
        <script src=
      </script>
    </head>
    <style>
        .container-fluid {
            background-color: #ffffff;
            border-radius: 8px;
            border: 1px solid lightgrey;
            padding: 16px;
            /* Box shadow for the register container */
            -webkit-box-shadow: 0px 0px 12px 2px rgba(0, 0, 0, 0.75);
            -moz-box-shadow: 0px 0px 12px 2px rgba(0, 0, 0, 0.75);
            box-shadow: 0px 0px 12px 2px rgba(0, 0, 0, 0.75);
        }
          
        .input-group {
            width: 80%;
            height: auto;
            padding: 4px;
        }
          
        .progress {
            height: 4px;
        }
          
        .progress-bar {
            background-color: green;
        }
    </style>
      
    <body>
        <br>
        <br>
        <div class="container">
            <div class="row">
                <div class="col-sm-3">   </div>
                <div class="col-sm-6">
                    <div class="container-fluid">
                        <center>
                            <h2 class="text-success">
                              Enter Password:
                          </h2>
                            <br>
                            <br>
                            <div class="form-group">
                                <div class="input-group">
                                    <span class="input-group-addon">
                                      <i class="glyphicon glyphicon-user">
                                      </i>
                                  </span>
                                    <input id="email" 
                                           type="text" 
                                           class="form-control"
                                           name="email"
                                           placeholder="User-Email">
                                </div>
                                <div class="input-group">
                                    <span class="input-group-addon">
                                      <i class="glyphicon glyphicon-lock">
                                      </i>
                                  </span>
                                    <input id="password" 
                                           type="password" 
                                           class="form-control" 
                                           name="password" 
                                           placeholder="Enter Password">
                                </div>
                            </div>
                            <div class="input-group">
                                <div class="progress">
                                    <div class="progress-bar" 
                                         role="progressbar" 
                                         aria-valuenow="0"
                                         aria-valuemin="0" 
                                         aria-valuemax="100"
                                         style="width:0%">
                                    </div>
                                </div>
                            </div>
                            <br>
                            <br>
                            <div class="input-group">
                                <button class="btn btn-success btn-block">
                                  Register Now!
                              </button>
                            </div>
                        </center>
                        <br>
                    </div>
                </div>
                <div class="col-sm-3">   </div>
            </div>
        </div>
    </body>
      
    </html>

    chevron_right

    
    

    Output:

  3. Updating progress bar:
    Now, we need to make sure that whenever the password input field is updated, the progress bar is updated according to the specified requirements mentioned above.
    Steps to be followed:

    • In the password field, check whenever key is pressed using keyup() function.
    • Extract the input added in the password field.
    • Update percentage variable and progress-bar color as per the password length.
    • Check for char-set constraints.
    • Update the width of the progress-bar.
    • Final Solution:

      filter_none

      edit
      close

      play_arrow

      link
      brightness_4
      code

      <!-- Update progress-bar whenever input field is updated.-->
      <!DOCTYPE html>
      <html lang="en">
        
      <head>
          <meta charset="utf-8" />
          <!-- Required CDN's -->
          <link rel="stylesheet"
                href=
          <script src=
        </script>
          <script src=
        </script>
      </head>
      <style>
          .container-fluid {
              background-color: #ffffff;
              border-radius: 8px;
              border: 1px solid lightgrey;
              padding: 16px;
              -webkit-box-shadow: 0px 0px 12px 2px rgba(0, 0, 0, 0.75);
              -moz-box-shadow: 0px 0px 12px 2px rgba(0, 0, 0, 0.75);
              box-shadow: 0px 0px 12px 2px rgba(0, 0, 0, 0.75);
          }
            
          .input-group {
              width: 80%;
              height: auto;
              padding: 4px;
          }
            
          .progress {
              height: 4px;
          }
            
          .progress-bar {
              background-color: green;
          }
      </style>
        
      <body>
          <br>
          <br>
          <div class="container">
              <div class="row">
                  <div class="col-sm-3">   </div>
                  <div class="col-sm-6">
                      <div class="container-fluid">
                          <center>
                              <h2 class="text-success">
                                Enter Password:
                            </h2>
                              <br>
                              <br>
                              <div class="form-group">
                                  <div class="input-group">
                                      <span class="input-group-addon">
                                        <i class="glyphicon glyphicon-user">
                                        </i>
                                    </span>
                                      <input id="email" 
                                             type="text" 
                                             class="form-control" 
                                             name="email" 
                                             placeholder="User-Email">
                                  </div>
                                  <div class="input-group">
                                      <span class="input-group-addon">
                                        <i class="glyphicon glyphicon-lock">
                                        </i>
                                    </span>
                                      <input id="password" 
                                             type="password" 
                                             class="form-control" 
                                             name="password" 
                                             placeholder="Enter Password">
                                  </div>
                              </div>
                              <div class="input-group">
                                  <div class="progress">
                                      <div class="progress-bar" 
                                           role="progressbar" 
                                           aria-valuenow="0" 
                                           aria-valuemin="0" 
                                           aria-valuemax="100" 
                                           style="width:0%">
                                      </div>
                                  </div>
                              </div>
                              <br>
                              <br>
                              <div class="input-group">
                                  <button class="btn btn-success btn-block">
                                    Register Now!
                                </button>
                              </div>
                          </center>
                          <br>
                      </div>
                  </div>
                  <div class="col-sm-3">   </div>
              </div>
          </div>
          <script>
              var percentage = 0;
        
              function check(n, m) {
                  if (n < 6) {
                      percentage = 0;
                      $(".progress-bar").css("background", "#dd4b39");
                  } else if (n < 8) {
                      percentage = 20;
                      $(".progress-bar").css("background", "#9c27b0");
                  } else if (n < 10) {
                      percentage = 40;
                      $(".progress-bar").css("background", "#ff9800");
                  } else {
                      percentage = 60;
                      $(".progress-bar").css("background", "#4caf50");
                  }
        
                  // Check for the character-set constraints
                  // and update percentage variable as needed.
                  
                  //Lowercase Words only
                  if ((m.match(/[a-z]/) != null)) 
                  {
                      percentage += 10;
                  }
                  
                  //Uppercase Words only
                  if ((m.match(/[A-Z]/) != null)) 
                  {
                      percentage += 10;
                  }
                  
                  //Digits only
                  if ((m.match(/0|1|2|3|4|5|6|7|8|9/) != null)) 
                  {
                      percentage += 10;
                  }
                  
                  //Special characters
                  if ((m.match(/\W/) != null) && (m.match(/\D/) != null))
                  {
                      percentage += 10;
                  }
        
                  // Update the width of the progress bar
                  $(".progress-bar").css("width", percentage + "%");
              }
        
              // Update progress bar as per the input
              $(document).ready(function() {
                  // Whenever the key is pressed, apply condition checks. 
                  $("#password").keyup(function() {
                      var m = $(this).val();
                      var n = m.length;
        
                      // Function for checking
                      check(n, m);
                  });
              });
          </script>
      </body>
        
      </html>

      chevron_right

      
      

      Output:




My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.