При валидации формы не выводятся ошибки
При валидации формы должны выводится ошибки (описаны в комментариях к коду 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>