В рамках задачи Frontend Mentor я создаю простую проверку электронной почты для целевой страницы подписки. Он просто проверяет, пусто ли поле электронной почты, и если да, то выдает сообщение об ошибке. Другое сообщение об ошибке отображается, если пользователь вводит неверный адрес электронной почты.
Я создал функцию с именем checkInputs(), которая содержит условный оператор else if.
При тестировании на реальном сервере первое условие работает нормально, когда я оставляю поле электронной почты пустым, однако второе условие даже не выполняется, равно как и третье.
Я включил полный на случай, если что-то еще отключит всю функцию. Я протестировал функцию isEmail(), которая проверяет, действителен ли адрес электронной почты, и у меня она работает нормально.
const form = document.getElementById('form');
const email = document.getElementById('email');
form.addEventListener('submit', (e) => {
e.preventDefault();
checkInputs();
})
function checkInputs() {
const emailValue = email.value;
const emptyEmail = emailValue === '';
const invalidEmail = !isEmail(emailValue);
if (emptyEmail) {
setErrorFor(email, 'Oops! Please add your email');
} else if (invalidEmail) {
setErrorFor(email, 'Oops! Please check your email');
} else {
setSuccessFor(emailValue);
}
};
function setErrorFor(input, message) {
const formGroup = input.parentElement;
const small = formGroup.querySelector('small');
formGroup.className = 'form-group error';
small.innerHTML = message;
}
function setSuccessFor(input) {
const formGroup = input.parentElement;
formGroup.className = 'form-group success';
}
// checks if email is valid
function isEmail(email) {
const regx = /^(([^<>()\[\]\\.,;:\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 regx.test(email);
}<div class = "form-group">
<form id = "form" method = "POST" name = "subscribe">
<input type = "email" placeholder = "Email address" name = "email" id = "email" class = "email-input error">
<br>
<small></small>
<br>
<button class = "form-btn" type = "submit">Request Access</button>
</form>
</div>Моя вина, я не правильно скопировал.
установитьSuccessFor(emailValue); выдает ошибку, потому что функция ожидает элемент ввода, но вы отправляете строку.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Это должно исправить это для вас:
const emptyEmail = emailValue === '';
к
const emptyEmail = (emailValue) ? true : false;
Также у вас есть ошибка в одной из ваших функций:
function setErrorFor(input, message) {
const formGroup = input.parentElement;
const small = formGroup.querySelector('small');
formGroup.className = 'form-group error';
small.innerHTML = message;
Должно быть (закрывающая скобка)
function setErrorFor(input, message) {
const formGroup = input.parentElement;
const small = formGroup.querySelector('small');
formGroup.className = 'form-group error';
small.innerHTML = message;
}
Как это ведет себя по-другому?
Честно говоря, я никогда не видел, чтобы переменная была назначена как const emptyEmail = emailValue === '' за всю мою карьеру. Я поверю вам на слово, что это действительно, но я бы определенно изменил его на то, что я указал
(emailValue) ? true : false буквально делает то же самое, что просто проверяет правдивость emailValue.
Спасибо, что нашли время ответить Джейми. Я все еще учусь и стараюсь изо всех сил :) Закрывающая скобка отсутствовала, потому что я не смог правильно скопировать и вставить ее.
(emailValue) ? true : false;: Излишне (). У вас неправильное условие, так как теперь оно будет возвращаться false, если электронное письмо пусто. Вместо всего троичного присваивания вы можете просто привести значение к логическому значению: const emptyEmail = !emailValueconst emptyEmail = emailValue ? true : false;
Это условие неверно, так как оно вернет true, если письмо не пустое.
Консоль говорит:
Uncaught TypeError: невозможно установить свойства неопределенного (настройка «className»)
на
function setSuccessFor(input) {
const formGroup = input.parentElement;
formGroup.className = 'form-group success';
}
Вы не передаете элемент формы
setSuccessFor(email);formGroup.classList.add('success');const form = document.getElementById('form');
const email = document.getElementById('email');
form.addEventListener('submit', (e) => {
e.preventDefault();
checkInputs();
})
function checkInputs() {
const emailValue = email.value;
const emptyEmail = emailValue === '';
const invalidEmail = !isEmail(emailValue);
email.parentElement.classList.remove('success');
if (emptyEmail) {
setErrorFor(email, 'Oops! Please add your email');
} else if (invalidEmail) {
setErrorFor(email, 'Oops! Please check your email');
} else {
setSuccessFor(email);
}
};
function setErrorFor(input, message) {
const formGroup = input.parentElement;
const small = formGroup.querySelector('small');
formGroup.className = 'form-group error';
small.innerHTML = message;
}
function setSuccessFor(input) {
const formGroup = input.parentElement;
formGroup.classList.add('success');
}
// checks if email is valid
function isEmail(email) {
const regx = /^(([^<>()\[\]\\.,;:\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 regx.test(email);
}.success { background-color:green }<div class = "form-group">
<form id = "form" method = "POST" name = "subscribe">
<input type = "email" placeholder = "Email address" name = "email" id = "email" class = "email-input error">
<br>
<small></small>
<br>
<button class = "form-btn" type = "submit">Request Access</button>
</form>
</div>
Не хватает
}, чтобы закрытьsetErrorFor.