При валидации формы не выводятся ошибки

При валидации формы должны выводится ошибки (описаны в комментариях к коду JS). Добавление класса, удаление и т.д.

'use strict'

const form = document.querySelector('.form')
const formInputs = document.getElementsByTagName('input')
const formLabels = document.getElementsByTagName('label')
const inputEmail = document.querySelector('.js-email')
const inputPass = document.querySelector('.js-pass')
const inputCheck = document.querySelector('.form__checkbox')
const errorsInput = document.querySelectorAll('.errors')
const errorEmail = document.querySelector('.errors_email')
const formCheck = document.querySelector('.form__check')

console.log(formInputs)
console.log(inputEmail)
console.log(inputPass)
console.log(inputCheck)
console.log(errorsInput)
console.log(formLabels)
console.log(formCheck)




function validateEmail(email) {
  let 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,}))$/;
  return re.test(String(email).toLowerCase());
}

form.addEventListener('submit', (even) => {
  even.preventDefault();
  let emailVal = inputEmail.value,
    passVal = inputPass.value;

  for (let elem of form.elements) {
    if (elem.tagName === 'INPUT' && elem.tagName !== 'BUTTON') {
      if (elem.value === '') {
        elem.classList.add('input-errors')
        // errorsInput.style.display='block' - не работает
      } else {
        elem.classList.remove('input-errors')
        // errorsInput.style.display='none' - не работает
      }
    };

    if (!validateEmail(emailVal)) {
      errorEmail.style.display = 'block'
    } else {
      errorEmail.style.display = 'none'
    }

    if (passVal < 8) {
      inputPass.classList.add('input-errors')
    }

    if (!inputCheck.checked) {
      formCheck.classList.add('input-errors') // не обводит чекбокс красным
      // errorsInput.style.display='none' - не работает
    }

  }

})
* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

body {
  background: #1B2473;
  color: #787878;
  font-family: Roboto;
  font-size: 16px;
}

.wrapper {
  min-width: 100%;
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100vh;
  padding: 20px;
}

.form {
  max-width: 600px;
  width: 100%;
  padding: 26px 46px 26px 45px;
  background: #fff;
  border-radius: 20px;
  box-shadow: 0px 0px 40px 10px rgba(0, 0, 0, 0.25);
}

.form__title {
  text-align: center;
  font-size: 50px;
  font-weight: bold;
  line-height: 100%;
  margin-bottom: 17px;
}

.form__group {}

.form__input_mg-bottom-13 {
  margin-bottom: 13px;
}

.form__input_mg-bottom-16 {
  margin-bottom: 16px;
}

.form__label-input {
  font-weight: bold;
  line-height: 100%;
}

.form__input {
  max-width: 509px;
  width: 100%;
  height: 49px;
  border: 2px solid #787878;
  color: #787878;
  border-radius: 10px;
  margin-top: 3px;
  padding: 0 0 0 10px;
  font-size: 28px;
}

.form__input::placeholder {
  font-weight: bold;
  line-height: 129%;
  color: #cccccc;
}

.errors {
  display: none;
  font-size: 10px;
  color: #CB2424;
}

.input-errors {
  border: 2px solid #CB2424;
}

.errors_email {
  display: none;
  font-size: 10px;
  color: #CB2424;
}

.errors_pass {
  display: none;
  font-size: 10px;
  color: #CB2424;
}

.form__label-checkbox {
  position: relative;
  font-size: 14px;
  line-height: 114%;
  margin-bottom: 52px;
  display: inline-flex;
  align-items: center;
  align-content: center;
  margin-left: 35px;
}

.form__checkbox {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  opacity: 0;
}

.form__check {
  position: absolute;
  width: 24px;
  height: 24px;
  border: 2px solid #787878;
  border-radius: 7px;
  margin-left: -35px;
}

.form__checkbox:checked+.form__check::after {
  content: '✓';
  position: absolute;
  left: 5px;
  top: 3px;
  color: #787878;
}

.form__btn {
  width: 180px;
  text-align: center;
  color: #fff;
  font-size: 24px;
  font-weight: bold;
  line-height: 67%;
  background: #1A226B;
  border: none;
  border-radius: 10px;
  cursor: pointer;
  padding: 18px;
}

.form__btn:hover {
  background: #3e4588;
}

.form__button-block {
  display: flex;
  justify-content: center;
  align-items: center;
}


/* ------------- 320 - 768------------------------- */

@media (max-width: 768px) {
  .form {
    max-width: 728px;
    height: 100%;
  }
  .form__title {
    font-size: 60px;
    line-height: 83%;
    margin-bottom: 13px;
  }
  .form__group {}
  .form__label-input {
    font-size: 24px;
    line-height: 67%;
  }
  .form__input {
    max-width: 638px;
    margin-top: 8px;
  }
  .form__input::placeholder {
    color: #cccccc;
  }
  .form__label-checkbox {
    font-size: 18px;
    line-height: 89%;
    margin-bottom: 64px;
  }
  .form__checkbox {
    width: 32px;
    height: 32px;
  }
  .form__button-block {}
  .form__btn {
    max-width: 220px;
    min-height: 80px;
    padding: 32px 64px;
    display: flex;
    justify-content: center;
    align-items: center;
  }
}
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link href="https://fonts.googleapis.com/css?family=Roboto:regular,700&display=swap" rel="stylesheet" />
  <link rel="stylesheet" href="/style.css">
  <title>Form</title>
</head>

<body>
  <div class="wrapper">
    <form action="#" class="form">

      <h1 class="form__title">Регистрация</h1>

      <div class="form__group">
        <label for="" class="form__label-input">Email</label>
        <input class="form__input js-email form__input_mg-bottom-13" name="email" type="text" placeholder="Введите Email">
        <div class="errors">Поле обязательно для заполнения</div>
        <div class="errors_email">Email невалидный</div>
      </div>

      <div class="form__group">
        <label for="" class="form__label-input">Пароль</label>
        <input class="form__input js-pass form__input_mg-bottom-16" name="pass" type="password" placeholder="Введите пароль">
        <div class="errors">Поле обязательно для заполнения</div>
        <div class="errors_pass">Пароль должен содержать как минимум 8 символов</div>
      </div>

      <div class="form__group">
        <label class="form__label-checkbox">
                        <input class="form__checkbox" name="checkbox" type="checkbox"> 
                        <div class="form__check"></div> 
                        Я согласен получать обновления на почту
                    </label>
        <div class="errors">Поле обязательно для заполнения</div>
      </div>
      <div class="form__button-block">
        <button class="form__btn" type="submit">Регистрация</button>
      </div>
    </form>
  </div>
  <!-- <script src="./script.js"></script> -->
  <script src="./script1.js"></script>
</body>

</html>


Ответы (1 шт):

Автор решения: Aleksandr Belous

'use strict';

const form = document.querySelector('.form');
const inputEmail = document.querySelector('.js-email');
const inputPass = document.querySelector('.js-pass');
const inputCheck = document.querySelector('.form__checkbox');
const errorsInput = document.querySelectorAll('.errors');

const emailValidator = (email) => {
  let 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,}))$/;
  return re.test(String(email).toLowerCase());
};

const emptyValidator = (value) => value.length > 0;

const validate = (value, validator) => validator(value.trim());

const clearAllErrors = (errorOutputs) => {
  errorOutputs.forEach((el) => (el.style.display = ''));
  document
    .querySelectorAll('.input-errors')
    .forEach((el) => el.classList.remove('input-errors'));
  document
    .querySelectorAll('.errors-custom')
    .forEach((el) => (el.style.display = ''));
};

const displayError = (targetInput, type) => {
  const formGroup = targetInput.closest('.form__group');

  switch (type) {
    case 'required':
      const errorOutput = formGroup.querySelector('.errors');
      targetInput.classList.add('input-errors');
      errorOutput.style.display = 'block';
      break;
    case 'custom':
      const customError = formGroup.querySelector('.errors-custom');
      customError.style.display = 'block';
      break;
    default:
      throw new Error(`displayError: Unknown error type - ${type}`);
  }
};

form.addEventListener('submit', (ev) => {
  ev.preventDefault();
  clearAllErrors(errorsInput);

  const email = inputEmail.value;
  const pass = inputPass.value;

  const isEmailEmpty = !validate(email, emptyValidator);
  const isEmailInvalid = !validate(email, emailValidator);
  const isPassEmpty = !validate(pass, emptyValidator);
  const isPassInvalid = !validate(pass, (value) => value.length > 8);
  const isAgree = inputCheck.checked;

  if (isEmailEmpty) {
    displayError(inputEmail, 'required');
  }

  if (isPassEmpty) {
    displayError(inputPass, 'required');
  }

  if (isEmailInvalid) {
    displayError(inputEmail, 'custom');
  }

  if (isPassInvalid) {
    displayError(inputPass, 'custom');
  }

  if (!isAgree) {
    displayError(inputCheck, 'required');
  }
});
* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

body {
  background: #1b2473;
  color: #787878;
  font-family: Roboto;
  font-size: 16px;
}

.wrapper {
  min-width: 100%;
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100vh;
  padding: 20px;
}

.form {
  max-width: 600px;
  width: 100%;
  padding: 26px 46px 26px 45px;
  background: #fff;
  border-radius: 20px;
  box-shadow: 0px 0px 40px 10px rgba(0, 0, 0, 0.25);
}

.form__title {
  text-align: center;
  font-size: 50px;
  font-weight: bold;
  line-height: 100%;
  margin-bottom: 17px;
}

.form__group {}

.form__input_mg-bottom-13 {
  margin-bottom: 13px;
}

.form__input_mg-bottom-16 {
  margin-bottom: 16px;
}

.form__label-input {
  font-weight: bold;
  line-height: 100%;
}

.form__input {
  max-width: 509px;
  width: 100%;
  height: 49px;
  border: 2px solid #787878;
  color: #787878;
  border-radius: 10px;
  margin-top: 3px;
  padding: 0 0 0 10px;
  font-size: 28px;
}

.form__input::placeholder {
  font-weight: bold;
  line-height: 129%;
  color: #cccccc;
}

.errors {
  display: none;
  font-size: 10px;
  color: #cb2424;
}

.input-errors {
  border: 2px solid #cb2424;
}

.errors-custom {
  display: none;
  font-size: 10px;
  color: #cb2424;
}

.form__label-checkbox {
  position: relative;
  font-size: 14px;
  line-height: 114%;
  margin-bottom: 52px;
  display: inline-flex;
  align-items: center;
  align-content: center;
  margin-left: 35px;
}

.form__checkbox {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  opacity: 0;
}

.form__check {
  position: absolute;
  width: 24px;
  height: 24px;
  border: 2px solid #787878;
  border-radius: 7px;
  margin-left: -35px;
}

.form__checkbox.input-errors~.form__check {
  border: 2px solid red;
}

.form__checkbox:checked+.form__check::after {
  content: '✓';
  position: absolute;
  left: 5px;
  top: 3px;
  color: #787878;
}

.form__btn {
  width: 180px;
  text-align: center;
  color: #fff;
  font-size: 24px;
  font-weight: bold;
  line-height: 67%;
  background: #1a226b;
  border: none;
  border-radius: 10px;
  cursor: pointer;
  padding: 18px;
}

.form__btn:hover {
  background: #3e4588;
}

.form__button-block {
  display: flex;
  justify-content: center;
  align-items: center;
}


/* ------------- 320 - 768------------------------- */

@media (max-width: 768px) {
  .form {
    max-width: 728px;
    height: 100%;
  }
  .form__title {
    font-size: 60px;
    line-height: 83%;
    margin-bottom: 13px;
  }
  .form__group {}
  .form__label-input {
    font-size: 24px;
    line-height: 67%;
  }
  .form__input {
    max-width: 638px;
    margin-top: 8px;
  }
  .form__input::placeholder {
    color: #cccccc;
  }
  .form__label-checkbox {
    font-size: 18px;
    line-height: 89%;
    margin-bottom: 64px;
  }
  .form__checkbox {
    width: 32px;
    height: 32px;
  }
  .form__button-block {}
  .form__btn {
    max-width: 220px;
    min-height: 80px;
    padding: 32px 64px;
    display: flex;
    justify-content: center;
    align-items: center;
  }
}
<div class="wrapper">
  <form action="#" class="form">
    <h1 class="form__title">Регистрация</h1>

    <div class="form__group">
      <label for="" class="form__label-input">Email</label>
      <input class="form__input js-email form__input_mg-bottom-13" name="email" type="text" placeholder="Введите Email" />
      <div class="errors">Поле обязательно для заполнения</div>
      <div class="errors-custom">Email невалидный</div>
    </div>

    <div class="form__group">
      <label for="" class="form__label-input">Пароль</label>
      <input class="form__input js-pass form__input_mg-bottom-16" name="pass" type="password" placeholder="Введите пароль" />
      <div class="errors">Поле обязательно для заполнения</div>
      <div class="errors-custom">
        Пароль должен содержать как минимум 8 символов
      </div>
    </div>

    <div class="form__group">
      <label class="form__label-checkbox">
            <input class="form__checkbox" name="checkbox" type="checkbox" />
            <div class="form__check"></div>
            Я согласен получать обновления на почту
          </label>
      <div class="errors">Поле обязательно для заполнения</div>
    </div>
    <div class="form__button-block">
      <button class="form__btn" type="submit">Регистрация</button>
    </div>
  </form>
</div>

→ Ссылка