2014-11-06 80 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