2017-10-10 15 views
-1

我收到以下错误与下面的JavaScript代码:不留神编码无限循环进入我的ASP.NET MVC应用程序的jQuery代码

RangeError: Maximum call stack size exceeded

我假设,这意味着我不小心编码一个无限循环到我的JavaScript。此代码来自使用jQuery Validate的ASP.NET MVC应用程序。此代码的目的是在提交之前检查页面上捕获的图像。

本质上,这是另一个需要与jQuery Validate一起发生的前端验证。似乎我唯一的选择是在提交表单时运行此代码,特别是因为在“提交”按钮单击和提交之间没有其他事件发生。这里是代码:

$('form').submit(function (e) { 
    e.preventDefault(); 
    //If Corporation is selected as business type 
    if ($('#businessStructure').val() == "Corporation") { 
     //Checks CEO signature present 
     if ($("#signImage").length == 0 || $("#signImage").attr("src") == "") { 
      alert("Please sign and save your signature in the CEO signature pad"); 
      $("#ceoError").show(); 
     } 
     else { 
      //all good, an image exists 
      $('form').submit(); 
     } 
    } 
    //If Sole Proprietor is selected as business type 
    else if ($('#businessStructure').val() == "SoleProprietor") { 
     //Checks CEO signature present 
     if ($("#signImage").length == 0 || $("#signImage").attr("src") == "") { 
      alert("Please sign and save your signature in the CEO signature pad"); 
      $("#ceoError").show(); 
     } 
     //Checks partner1 signature present 
     if ($("#signImage1").length == 0 || $("#signImage1").attr("src") == "") { 
      alert("Please sign and save your signature in the first partner signature pad"); 
      $("#partner1Error").show(); 
     } 
     else { 
      //all good, an image exists 
      $('form').submit(); 
     } 
    } 

    else { 
     //Checks CEO signature present 
     if ($("#signImage").length == 0 || $("#signImage").attr("src") == "") { 
      alert("Please sign and save your signature in the CEO signature pad"); 
      $("#ceoError").show(); 
     } 
     //Checks partner1 signature present 
     if ($("#signImage1").length == 0 || $("#signImage1").attr("src") == "") { 
      alert("Please sign and save your signature in the first partner signature pad"); 
      $("#partner1Error").show(); 
     } 
      //Checks partner2 signature present 
      if ($("#signImage2").length == 0 || $("#signImage2").attr("src") == "") { 
       alert("Please sign and save your signature in the second partner signature pad"); 
       $("#partner2Error").show(); 
      } 
      else { 
       //all good, an image exists 
       $('form').submit(); 
      } 
    } 
}); 

这是我第一次做了MVC应用程序表单提交的并发事件。有没有我不知道的另一种方法?

+2

这是因为您调用'$('form')。submit();'。如果你想让它做正常的表单提交,不要调用'e.preventDefault()'。 –

+0

您一次又一次地调用函数'$(form).submit()'。它是递归的。这可能会有所帮助:https://stackoverflow.com/questions/7065120/calling-a-javascript-function-recursively – colecmc

+0

我试图从$('form')改变事件。submit(function(e)to $(' #submitButton')。click(function(e),但它工作不正常。警​​告框出现,但表单仍在提交。任何想法? – cryan

回答

1

正如其他人在评论中提到的那样,您正在调用代码中的表单上的submit方法,这会使整个代码再次执行,包括您的其他条件,这又会再次调用提交,从而导致无限提交事件

else { 
      //all good, an image exists 
      $('form').submit(); 
     } 

为了解决这个问题,你可以使用表单

<form action="someUrl" method="post"> 
    <button type="button" id="btn-save">Save</button> 
</form> 

和里面的按钮标识线了您的活动脚本将

$("#btn-save").click(function(e){ 
    e.preventDefault(); 
    // your existing code 
}); 

为了得到一个参考表单,我建议使用相对选择器来获取表单。在这种情况下,closest()方法将得心应手

$("#btn-save").click(function(e){ 
    e.preventDefault(); 
    var $form = $(this).closest("form"); 

    if(yourValidationCodeGoesHere) 
    { 

    } 
    else 
    { 
    $form.submit(); 
    } 

}); 
+0

我最初的目的是让所有这些代码都发生在点击按钮上。不幸的是,它一直没有正常工作。弹出警报,但表单继续提交。 – cryan

+0

如果你有'e.preventDefault();',表单不应该提交。 – Shyju

+0

好吧,我只是再次尝试了代码(意识到e.preventDefault();被注释掉了),现在我遇到了另一个问题。该代码几乎完全符合我的需求,但在发生警报并输入缺少的签名后,我无法再单击提交按钮。如何在用户修复错误后将功能恢复到提交按钮? – cryan