2017-01-22 1 views
0

Я пытаюсь применить простую проверку формы в jQuery. Если поле формы пустое, добавьте класс error. Если какое-либо из полей пуст, не отправляйте их. У меня есть следующие:Максимальный размер стека вызовов превышен с помощью jQuery prom()

$('#contact-form').submit(function(event) { 
    event.preventDefault(); 

    var formValid = true; 
    $('input.required, textarea.required, select.required').each(function() { 
     if($(this).val() === '') { 
      formValid = false; 
      $(this).addClass('error'); 
     } else { 
      $(this).removeClass('error'); 
     } 
    }).promise().done(function() { 
     if(formValid) { 
      $('#contact-form').submit(); 
     } 
    }); 
}); 

Howerver когда код попадает в линию, чтобы отправить форму, я вижу ошибку JavaScript:

Uncaught RangeError: Максимальный размер стека вызовов превысил

+0

Я заподозрить это потому, что вы создаете обещание на каждом из поля. Во всяком случае, в чем цель обетования? Я не вижу асинхронных операций в коде. –

+0

Обещание говорит мне, когда '.each()' закончен. – Justin

+1

@Justin: Нет. '.each()' является * синхронной * функцией. Он заканчивается, когда вы достигаете следующей строки кода. Вам не нужно и не следует использовать это обещание. (Подробнее см. В нижеприведенном ответе.) –

ответ

2

Вот как ваш код будет работать, если форма является действительным:

  1. по представить, предотвратить действие по умолчанию
  2. проверки полей
  3. , если они действительны, форма .submit - который вызывает событие отправки, goto шаг 1

бесконечная рекурсия

это очень просто, потому что нет никакого асинхронного кода в обработчике

$('#contact-form').submit(function(event) { 
    var formValid = true; 
    $('input.required, textarea.required, select.required').each(function() { 
     if($(this).val() === '') { 
      formValid = false; 
      $(this).addClass('error'); 
     } else { 
      $(this).removeClass('error'); 
     } 
    }); 
    if (!formValid) { 
     event.preventDefault(); 
    } 
}); 
+0

Ах, это проблема. Итак, как мне привязываться к '.submit()', а затем иметь возможность 'submit()' позже без повторного ввода привязки? – Justin

+0

@WillianValhakis ответ - хотя мне не нравится его возврат false вместо 'preventDefault()' - эта часть неверна –

+0

Это близко, но требуется дважды нажать кнопку отправки формы. Первый клик не отправляет форму. – Justin

0

Как нужно ли проверять многие поля и почему обещание связано с каждым из них? попробуйте после проверки всех полей

if(formValid) { 
      $('#contact-form').submit(); 
     } 
else return false 
0
$('#contact-form').submit(function(event) { 
    event.preventDefault(); 
    var formValid = true; 
    $('input.required, textarea.required, select.required').each(function() { 
     if($(this).val() === '') { 
     formValid = false; 
     $(this).addClass('error'); 
     } else { 
     $(this).removeClass('error'); 
     } 
    }).promise().done(function() { 
     if(formValid) { 
     $("#contact-form").off('submit').submit(); 
     } 
    }); 
    return false; 
}); 
0

Во-первых, .promise().done(...) могут быть удалены. Как уже было сказано, ничего асинхронного не происходит.

В стороне, фактическая проблема, скорее всего, повторный повторный вызов обработчика отправки.

Попробуйте POJS (в отличие от JQuery) формы представления:

if(formValid) { 
    this.submit(); 
} 
+0

обработчик отправки по-прежнему будет вызываться независимо от способа подачи заявки –

+0

@JaromandaX, я считаю, что нет. –

+0

Ну, я кое-что узнал! Я искренне думал, что вы ошибаетесь: p –

Смежные вопросы