Задать вопрос
@SHNM

Почему данный код работает не правильно?

Здравствуйте! Хочу сделать валидацию, то бишь, если все поля заполнены делать кнопку активной
Вот код
$('form').find('input').each(function () { 
 $($(this)).on('input', function () { 
 if ($(this).val().length == 0) { 
 $('.button').attr('disabled', true); 
 } 
 else { 
 $('.button').attr('disabled', false); 
 } 
 }) 
 })

Странно, он работает таким образом: если я заполню одно поле, то кнопка станет активной, а нужно, чтобы если все поля заполнены, то делать кнопку активной, что не так тут?))
  • Вопрос задан
  • 126 просмотров
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
  • Академия Эдюсон
    Fullstack-разработчик на JavaScript + ИИ
    11 месяцев
    Далее
  • ProductStar × РБК
    Профессия: Инженер по тестированию + ИИ
    6 месяцев
    Далее
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Причина номер раз: потому что автор кода говнокодер. Ну, то есть - вы даже отформатировать код не удосужились. Причина номер два: проверяется состояние только одного инпута, того, где случилось событие. А надо проверять все.

Исправляем:

$('form').on('input', function() {
  $('.button').prop('disabled', $('input', this).get().some(n => !n.value));
}).trigger('input');

Или, к чёрту jquery:

const form = document.querySelector('form');
const button = document.querySelector('.button');

// можно по-прежнему самостоятельно проверять значения input'ов
const inputs = [...form.querySelectorAll('input')];
const onInput = () => button.disabled = !inputs.every(n => n.value);
form.addEventListener('input', onInput);
onInput();

// но если добавить input'ам атрибут required...
form.addEventListener('input', function() {
  button.toggleAttribute('disabled', !this.checkValidity());
});
form.dispatchEvent(new Event('input'));
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы