Проверка валидности формы и показ предупреждений

Как сделать, чтобы в <label> добавлялся класс .label__errors и div.errors менялся на display: block при отсутствии введенных данных?

'use strict'

const form = document.querySelector('.form')
const formInputs = document.getElementsByTagName('input')
const inputEmail = document.querySelector('.js-email')
const inputPass = document.querySelector('.js-pass')
const inputCheck = document.querySelector('.js-check')
const errors = document.querySelectorAll('.errors')

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();
  for (let elem of form.elements) {
    if (elem.tagName === 'INPUT' && elem.tagName !== 'BUTTON') {
      if (elem.value === '') {
        elem.classList.add('input-errors')
      } else {
        elem.classList.remove('input-errors')
      }
    }
  }
})
* {
  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%;
}

.label__errors {
  color: #CB2424;
}

.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;
}

.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="email" placeholder="Введите Email">
        <div class="errors">Поле обязательно для заполнения</div>
        <div class="errors 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>

      <div class="form__group">
        <label class="form__label-checkbox">
                <input class="form__checkbox js-check" 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 шт):

Автор решения: UModeL

Отсутствие подробностей в вопросе не способствует развёрнутому ответу. Но, похоже, что логика проверки должна быть следующая:

"use strict";

const form = document.querySelector(".form");
const formInputs = document.getElementsByTagName("input");
const inputEmail = document.querySelector(".js-email");
const inputPass = document.querySelector(".js-pass");
const inputCheck = document.querySelector(".js-check");
const errors = document.querySelectorAll(".errors");

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());
}

function checkValid(even) {
  even.preventDefault();

  for (let elem of form.elements) {
    if (elem.tagName === "INPUT" && elem.tagName !== "BUTTON") {
      elem.classList.toggle("input-errors", elem.value === "");
      elem
        .closest(".form__group")
        .querySelector("label")
        .classList.toggle("label__errors", elem.value === "");
      elem
        .closest(".form__group")
        .querySelectorAll(".errors:not(.errors_email)")
        .forEach((el) => (el.style.display = elem.value === "" ? "block" : ""));
      elem
        .closest(".form__group")
        .querySelectorAll(".errors_email")
        .forEach(
          (el) => (el.style.display = validateEmail(elem.value) ? "" : "block")
        );
    }
  }
}

form.addEventListener("input", checkValid);
form.addEventListener("submit", checkValid);
* {
  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%;
}

.label__errors {
  color: #cb2424;
}

.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;
}

.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;
  }
}
<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="email" placeholder="Введите Email">
      <div class="errors">Поле обязательно для заполнения</div>
      <div class="errors 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>

    <div class="form__group">
      <label class="form__label-checkbox">
        <input class="form__checkbox js-check" 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>

→ Ссылка