2016-09-14 132 views
3

我有一个快速的问题,在我的javascript代码我有这样的:JQuery - 表单提交 - 多次?

\t $('form').submit(function (e) { 
 
\t \t var form = $(this); 
 
\t \t console.log('submit attempt'); 
 
\t \t $('input, select, textarea').each(function() { 
 
\t \t \t var attr = $(this).attr('required'); 
 
\t \t \t if (typeof attr == typeof undefined || attr == false || (attr = 'Y' && $(this).val() != '')) { 
 
\t \t \t \t if($(this).hasClass('numeric')) { 
 
\t \t \t \t \t if(isNumber($(this).val())) { 
 
\t \t \t \t \t \t $(form).submit(); 
 
\t \t \t \t \t } 
 
\t \t \t \t } 
 
\t \t \t \t else { 
 
\t \t \t \t \t $(form).submit(); 
 
\t \t \t \t } 
 
\t \t \t } 
 
\t \t \t else { 
 
\t \t \t \t e.preventDefault(); 
 
\t \t \t \t $(this).css('border','1px solid red'); 
 
\t \t \t } 
 
\t \t }); 
 
\t });

而且在控制台日志中我得到了超过1300个的消息“提交的尝试”,那么一个错误:

Uncaught RangeError: Maximum call stack size exceeded

你们有什么想法,为什么发生这种情况,以及如何解决它?也许关于submit()的一些棘手的事情我忘了?

如果需要更多信息,请告诉我。

谢谢!

+1

您应该从循环中删除'$(form).submit();',因为它会导致多个表单递归递交。 –

+1

问题是你递交递交递交表单递归调用递归 –

+0

哦,对了!你知道我怎么能提交表单,当我在if条件没有成为一个循环? 我的意思是:如果条件是真的发送表单,否则preventDefault ....没有条件写什么就够了? – Praem

回答

0

如果没有错误,表单将随每个输入或textarea一起提交。

因此,首先循环字段,定义是否有失败。如果没有,发送它:

$('form').submit(function(e) { 
    var form = $(this); 
    var failure = false; 
    console.log('submit attempt'); 
    $('input, select, textarea').each(function() { 
    var attr = $(this).attr('required'); 
    if (typeof attr == typeof undefined || attr == false || (attr = 'Y' && $(this).val() != '')) { 
     failure = true; 
     $(this).css('border', '1px solid red'); 
    } 
    if ($(this).hasClass('numeric') && !isNumber($(this).val())) { 
     failure = true; 
     $(this).css('border', '1px solid red'); 
    } 
    }); 
    if (failure) { 
    e.preventDefault(); 
    } 
}); 
+0

这仍然会在'.submit()'中调用'.submit()',同样的问题(只是更少)。根本不需要最后的'.submit()'并让事件完成而不被阻止。 –

+0

@ freedomn-m,你的权利......最后一个'else {}'可以被删除,我已经编辑了我的答案。 – LinkinTED

+0

谢谢你们的帮助!我喜欢你说:“如果你的.submit()事件处理程序在没有e.preventDefault()的情况下结束,那么表单将提交。” – Praem

1

问题是,您在提交递归调用递归内再次提交表单。这是你应该怎么做的。如果验证失败,isValid包含false并停止提交表单;

$('form').submit(function(e){ 
var isValid = true; 
    $('input, select, textarea').each(function() { 
      var attr = $(this).attr('required'); 
      if (typeof attr == typeof undefined || attr == false || (attr = 'Y' && $(this).val() != '')) { 
       if($(this).hasClass('numeric')) { 
        if(!isNumber($(this).val())) { 
         isValid = false; 
      return isValid; 
        } else { 
          e.preventDefault(); 
          $(this).css('border','1px solid red'); 
        } 
       } 

      } 
      else { 
     e.preventDefault(); 
       $(this).css('border','1px solid red'); 
     isValid = false; 
     return isValid; 
      } 
     }); 
    return isValid; 

});