开发者问题收集

jQuery promise() 超出最大调用堆栈大小

2017-01-22
1462

我尝试在 jQuery 中应用简单的表单验证。如果表单字段为空,则添加类 error 。如果任何字段为空,则不要提交。我有以下问题:

$('#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();
        }
    });
});

然而,当代码到达提交表单的行时,我看到了 JavaScript 错误:

Uncaught RangeError:超出最大调用堆栈大小

3个回答

如果表单有效,代码将按以下方式运行:

  1. 提交时,阻止默认操作
  2. 检查字段
  3. 如果有效,form.submit - 引发提交事件,转到步骤 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();
    }
});
Jaromanda X
2017-01-22

您需要验证多少个字段,为什么承诺与每个字段相关联?检查完所有字段后再尝试

if(formValid) {
            $('#contact-form').submit();
        }
else return false
Frenchi In LA
2017-01-22
$('#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;
});
William Valhakis
2017-01-22