Проверка электронной почты с использованием JavaScript не работает в статусе if

В рамках задачи 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>

Не хватает }, чтобы закрыть setErrorFor.

Cerbrus 28.10.2022 13:12

Моя вина, я не правильно скопировал.

Yazzybandyham 28.10.2022 13:17

установитьSuccessFor(emailValue); выдает ошибку, потому что функция ожидает элемент ввода, но вы отправляете строку.

Yogi 28.10.2022 13:25
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
3
97
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Это должно исправить это для вас:

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

Как это ведет себя по-другому?

Cerbrus 28.10.2022 13:16

Честно говоря, я никогда не видел, чтобы переменная была назначена как const emptyEmail = emailValue === '' за всю мою карьеру. Я поверю вам на слово, что это действительно, но я бы определенно изменил его на то, что я указал

Jamie Burton 28.10.2022 13:20
(emailValue) ? true : false буквально делает то же самое, что просто проверяет правдивость emailValue.
Pointy 28.10.2022 13:21

Спасибо, что нашли время ответить Джейми. Я все еще учусь и стараюсь изо всех сил :) Закрывающая скобка отсутствовала, потому что я не смог правильно скопировать и вставить ее.

Yazzybandyham 28.10.2022 13:32
(emailValue) ? true : false;: Излишне (). У вас неправильное условие, так как теперь оно будет возвращаться false, если электронное письмо пусто. Вместо всего троичного присваивания вы можете просто привести значение к логическому значению: const emptyEmail = !emailValue
Cerbrus 28.10.2022 13:49
const emptyEmail = emailValue ? true : false;

Это условие неверно, так как оно вернет true, если письмо не пустое.

Cerbrus 28.10.2022 13:51
Ответ принят как подходящий

Консоль говорит:

Uncaught TypeError: невозможно установить свойства неопределенного (настройка «className»)

на

function setSuccessFor(input) {
  const formGroup = input.parentElement;
  formGroup.className = 'form-group success';
}

Вы не передаете элемент формы

  1. Изменить setSuccessFor(email);
  2. Советую тоже поменять formGroup.classList.add('success');
  3. Возможно, удалите успех перед тестированием, хотя в настоящее время невозможно добавить неправильный адрес электронной почты из-за проверки HTML5.

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>

Другие вопросы по теме