2014-11-06 83 views
-2

这是我的自定义提交功能与验证。它显示“太多递归”后,我点击提交。jQuery提交的“递归太多”

$('#searchform').on('submit', function(e){ 
 
    var validateError = ''; \t 
 
    var id = ''; 
 
    var fieldError = []; 
 

 
    $('#searchform :input:text').each(function(){ 
 
     id = $(this).attr('id'); 
 
     validateError = jQuery.fn.validationEngine.loadValidation(document.getElementById(id)); 
 
     if (validateError) { 
 
      fieldError.push(id); 
 
     } 
 
    }); 
 

 
    if (fieldError.length != 0) { 
 
     return false; 
 
    } 
 
    else { 
 
     $("form#searchform").submit(); 
 
     return true; 
 
    } 
 
}); 
 
});

我的形式占用太多的时间提交。在控制台中,我可以看到我的验证Ajax方法正在无限调用。我如何解决这个问题。

+3

这是n重新审视但递归。您正在表单的提交处理程序中重新提交您的表单。 – 2014-11-06 10:24:37

回答

6

问题是,如果表单有效,你可以调用.submit(),它会再次调用你的回调函数,再次调用.submit()等等,并且你得到一个无限递归循环。

只是删除

else { 
    $("form#searchform").submit(); 
    return true; 
} 

完全和它应该工作(你的回调将不会返回任何东西,浏览器将使用默认的表格提交行为)。

+0

感谢您的回答。我需要添加e.preventDefault();如果验证失败? – 2014-11-06 10:33:31

+0

不,你不需要它,因为你已经有'return false;' – 2014-11-06 11:41:17

1

你需要停止提交内重新提交:

改变这一点:

else { 
    $("form#searchform").submit(); 
    return true; 
} 

到:

else { 
    return true; 
} 

只是删除它完全为默认(如果你不返回任何东西)也是继续提交。

当验证失败时,您已经正确返回false,因此不需要使用e.preventDefault()return falsee.preventDefault()e.stopPropagation()都一样。

即这是正确的:

if (fieldError.length != 0) { 
    return false; 
} 

虽然可以测试非零长度只有这个:

if (fieldError.length) { 
    return false; 
} 
1

无需提交表单中else语句:

变化您的声明:

else { 
    return true; 
} 
+0

请在发布之前检查你的答案是否已经有*确切的重复*。 :) – 2014-11-06 10:43:18