【问题标题】:Form submission causing 'Maximum call stack size exceeded'表单提交导致“超出最大调用堆栈大小”
【发布时间】:2015-07-13 09:10:35
【问题描述】:

我创建了一个表单,用于审查网站上的某个人,但是当提交表单时没有任何反应,并且控制台显示“超出最大调用堆栈”。希望有人可以帮助指出我的代码中的错误,阻止它工作。这是表单代码:

 <form id="fReviewMe" method="post" action="/process/review-p.cfm" enctype="multipart/form-data" style="display:none">
    <label style="padding-top:10px"><i class="fa fa-asterisk magenta"></i> Your Name:</label>
    <input type="text" name="uname" id="uname" class="span8" placeholder="Please tell us your name">
    <label><i class="fa fa-asterisk magenta"></i> Your Business Name:</label>
    <input type="text" name="business" id="business" class="span8" placeholder="Please tell us your business name">
    <label><i class="fa fa-asterisk magenta"></i> Your Review:</label>
    <textarea name="reviewmsg" id="reviewmsg" class="span8" rows="8" placeholder="Please add your review in here"></textarea>
    <!--- form errors --->
            <div id="dFormErrors" class="row" style="display:none;padding-bottom:20px;">
              <span id="sEMessage" class="pull-right"></span>
              <i class="fa fa-asterisk magenta pull-right"></i>
            </div>
                                        
   <!--- form buttons --->
  <div id="dButtonsReviewForm" class="row">
      <a onClick="checkForm()" name="submit" class="cta pull-right">Submit</a>
      <a href="javascript:hideReviewMe()" class="pull-right cta" style="margin-right:6px">Cancel</a>
   </div>
  <!--- form saving --->
      <div id="dSavingReviewForm" style="display:none">
          <span class="pull-right hibuBtn" style="cursor:wait"><i class="fa fa-spinner fa-spin"></i> Saving</span>
      </div>

这里是JS代码:

/* intercept submit event */
$( "#fReviewMe" ).submit(function(event) {
  checkForm();
  event.preventDefault();
});

/* form validation */
function checkForm(){
  var errors = 0;
  var cuname = $('#uname').val();
  var ccompany = $('#business').val()
  var creview = $('#reviewmsg').val()
  var cstars = $('#rStar').val()
  var eMessage = "";
  $('#dFormErrors').hide();
  $('input').removeClass('validFalse');
  $('textarea').removeClass('validFalse');

  if ($('#tnc').is(':checked')) {
  }
  else{
    eMessage = "Please tick to accepts out terms and conditions";
    errors++;   
  }

  if(cstars.length < 1){
    $("input").blur();
    $("textarea").blur();
    eMessage = "Please choose a star rating";
    errors++;
  }

  if(creview.length < 1){
    $('#reviewmsg').focus();
    $('#reviewmsg').addClass('validFalse');
    eMessage = "Please add your review";
    errors++;
  }
  else{
    $('#reviewmsg').addClass('validTrue');
  }

  if(ccompany.length < 1){
    $('#business').focus();
    $('#business').addClass('validFalse');
    eMessage = "Please tell us your business name";
    errors++;
  }
  else{
    $('#business').addClass('validTrue');
  }

  if(cuname.length < 1){
    $('#uname').focus();
    $('#uname').addClass('validFalse');
    eMessage = "Please tell us your name";
    errors++;
  }
  else{
    $('#uname').addClass('validTrue');
  }

  /* check errors and submit */
  if(errors > 0){
    $('#dFormErrors').slideDown();
    $('#sEMessage').html(eMessage)
  }
  else{
    $('#dButtonsReviewForm').hide();
    $('#dSavingReviewForm').show();
    $('#fReviewMe').submit();
  }

}

提前致谢

【问题讨论】:

    标签: javascript jquery html forms


    【解决方案1】:

    $('#fReviewMe').submit(); 替换为:

    $('#fReviewMe')[0].submit();
    

    调用 DOM 节点方法 submit 以避免提交 jQuery 处理程序“循环”。

    【讨论】:

    • @A. Wolff 感谢您指出还有其他点击提交,您给了我一个教训。删除了我的答案,因为它没有考虑所有可能性。
    • 感谢这帮助我解决了这个问题。因此,如果我理解正确,Dom Node.submit() 和 JQuerySelectedElement.submit() 的调用会有所不同吗?我的期望是,如果我在 Jquery 中选择一个元素,则会调用相应的 Dom 函数(如果存在)。所以事实并非如此。分享
    • 另一个关于 jquery 验证的方法是 submitHandler: function(form) { form.submit(); } 而不是 $(form).submit();
    猜你喜欢
    • 1970-01-01
    • 2023-01-26
    • 2014-11-17
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    • 2018-08-24
    • 1970-01-01
    • 2015-10-24
    相关资源
    最近更新 更多