JavaScript form validation bug: the invalid email error message is never displayed

Viewed 293

I am working on a form validator class in JavaScript.

First, I check (make sure) that all required fields are filled. If they are, I validate the email format:

class FormValidator {
  constructor() {
    this.hasErrors = false;
    this.emptyRequired = [];
    this.errorMsg = "";
        this.formToValidate = document.querySelector("form");
    this.submitButton = this.formToValidate.querySelector("input[type=submit]");
    }
  
  appendErrorMessage(){
    const errorEl = `<span class="error-message">${this.errorMsg}</span>`;
    this.emptyRequired.forEach((field) => {
       let parentEl = field.parentElement;
       if(this.hasErrors == true && parentEl.querySelectorAll('.error-message').length == 0) {
        field.insertAdjacentHTML('afterend', errorEl);
       }
    });
  }
  
  validateEmail() {
      this.hasErrors = false;
      const re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
      const emailFiled = this.formToValidate.querySelector('input[type=email]');
      if (this.emptyRequired.length == 0) {
        const action = re.test(emailFiled) ? 'remove' : 'add';
        emailFiled.classList[action]('is-invalid');
        
        this.hasErrors = re.test(emailFiled) ? false : true;
        this.errorMsg = "Please provide a valid email";
        this.appendErrorMessage();
      }
      
  }
  
  validateRequired() {
      this.hasErrors = false;
      this.emptyRequired = [];
      const requiredFields = this.formToValidate.querySelectorAll('*[required]');
      requiredFields.forEach((field) => {
        // Make sure all required fields have values
        // Before doing other validations
        if(!field.value) {
           this.hasErrors = true;
           this.emptyRequired.push(field);
           this.errorMsg = "This field is required";
           this.appendErrorMessage();
        }
        const action = field.value ? 'remove' : 'add';
        field.classList[action]('is-invalid');
    });
  }
  
  validateForm() {
    this.validateRequired();
    this.validateEmail();
    console.log(this.errorMsg);
  }
  
  submitForm(e) {
    e.preventDefault();
    this.validateForm();
  }
  
  init() {
    this.formToValidate.addEventListener('submit', e => this.submitForm(e));
  }
}

const formValidator = new FormValidator();
formValidator.init();
.form-group {
  position: relative;
}

.error-message {
    margin: 0;
    position: absolute;
    right: 5px;
    bottom: -13px;
    color: #a94442;
    font-size: 11px;
}
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet"/>
<div class="container">
  <div class="card my-3">
    <div class="card-header">Contact us</div>
    <div class="card-body">
      <form action="/" novalidate>
        <div class="form-group">
          <input type="text" name="name" class="form-control" placeholder="Your Name" value="" required />
        </div>
        <div class="form-group">
          <input type="email" name="email" class="form-control" placeholder="Your Email" value="" required />
        </div>
        <div class="form-group">
          <input type="text" name="phone" class="form-control" placeholder="Your Phone Number" value="" required />
        </div>
        <div class="form-group">
          <textarea name="message" class="form-control" placeholder="Your Message"></textarea>
        </div>
        <div class="form-group mb-0">
          <input type="submit" name="btnSubmit" class="btn btn-success btn-block" value="Send Message" />
        </div>
      </form>
    </div>
  </div>
</div>

The problem

I filled all the form fields, including the email. The email I provided is invalid.

For a reason I have not been able to figure out, the message Please provide a valid email is never appended to the <div class="form-group">.

enter image description here

0 Answers
Related