2013-07-14 163 views
1

我的表單有一個輸入需要在提交之前進行驗證。成功驗證後,我嘗試提交表單,但不提交。如何在AJAX驗證後使用jQuery提交表單?

我的代碼如下所示:

$(document).ready(function() { 
    $("#myForm").submit(function() { 
     checkInputData(); 
     return false; // to prevent default submit 
    }); 
}); 

驗證功能:

function checkInputData() { 
    var id = $($("#id")).val(); // value, which needs to be validated 
    $.get("check.php?id=" + id, 
     function(result){ 
      if(result == 1) { 
       //if the result is 1, need to submit 
       $("#myForm").unbind(); // to prevent recursion? 
       $("#myForm").submit(); // doesnt work 
      } else { 
       // dont submit, give some visual feedback, etc... 
      } 
    }); 
} 

我到底做錯了什麼?謝謝。

+0

你在控制檯中的任何錯誤? –

+0

爲什麼不在提交表單時進行驗證而不是兩次前往服務器?您的驗證方法,現在可以被擊敗,除非您在表單提交重新驗證。 –

+0

控制檯中沒有錯誤。 需要在提交前進行驗證,因爲表單提交的圖片較大。 – Dusan

回答

4

您需要從AJAX驗證請求中返回結果。您可以通過將此檢查設置爲async: false來執行此操作,這意味着checkInputData()將等待結果返回,並且您可以將其返回,從而控制表單的提交。

在您的代碼中,它不會等待$.get動作發生,它似乎跳過了意味着您的代碼始終顯示爲checkInputData()呼叫的return true;。如果按以下方式使用,則無需提交return false

我已經使用代替$.get$.ajax調用,因爲它可以讓你控制async屬性,但它本質上是做同樣的事情。你可以閱讀更多關於它here

function checkInputData() { 
    var value = $("#id").val(); // Value to be validated 
    var passedValidation = false; 
    $.ajax("check.php?id=" + value, { 
     async: false, 
     success: function(result){ 
      // Do whatever check of the server data you need here. 
      if(result == "1") { 
       // Good result, allow the submission 
       passedValidation = true; 
      } else { 
       // Show an error message 
      } 
     } 
    }); 
    return passedValidation; 
} 

$(document).ready(function() { 
    $("#myForm").on("submit", function() { 
     return checkInputData(); 
    }); 
}); 

我假設你有一個按鈕,如下面的表格內的ID myForm

<input type="submit" value="Submit Form" /> 
+1

這是工作。 async:false是解決方案。謝謝你的幫助! – Dusan

+0

@Dusan不客氣,很高興你有它的工作。 – Scott

+1

其他人閱讀此:這是不好的建議,永遠不要這樣做 - 這將掛起瀏覽器等待響應。 –

-1
 $(document).ready(function() { 
      $("#myForm").submit(function (e) { 
       checkInputData(); 
       //return false; // to prevent default submit <-- THIS IS WRONG 


       e.preventDefault(); //Try this :) 
      }); 
     }); 

返回false將阻止它在所有情況下提交。

+3

這不是真的解釋發生了什麼問題。添加你改變的描述,而不僅僅是一些「這是錯誤的」代碼註釋 – Bojangles

0

它沒有得到提交的可能是因爲你沒有在下面if condition

if(result == 1) { 

上驗證成功返回1resultcheck.php你的輸出應該是1,像echo '1';如果輸入有效。並確保在它之前或之後沒有任何其他輸出。

0

AMember是正確的你總是返回false,也有一些解決方案。一種解決方案是讓你將驗證綁定到一個按鈕元素或任何不會提交表單的元素。

HTML

<form id="myForm"> 
    . 
    input elements 
    . 
    <button class= "submit" type="button" onclick="submit">Submit</button> 
</form> 

文檔準備

$(function() 
{ 
    var $submit = $(".submit"); 

    $submit.click(function() 
    { 
    checkInputData(); 

    }); 
}); 

驗證回調函數

function checkInputData() 
{ 
    var id = $('#id').val(); // value, which needs to be validated 

    $.get("check.php?id=" + id, function(result) 
    { 
     if(result == 1) 
     { 
      var $myForm = $("#myForm"); 

      //if the result is 1 submit. 
      $myForm.submit(); 
     } 
     else 
     { 
      // dont submit, give some visual feedback, etc... 
     } 
    }); 

}

+0

綁定到'submit'事件是更好的方法。如果您使用諸如iOS的移動瀏覽器,它將允許您使用它自己的UI提交鍵盤上的Submit按鈕,從而避免您的按鈕和驗證。有些瀏覽器在按下返回鍵時也會提交表單。 submit事件的目的是控制驗證。 – Scott

+0

@Scott如果你的支持移動平臺,你正確的解決方案將是一個不正確的設計。據說這個用戶只能在表單中存在類型爲submit的輸入時繞過按鈕。由於在我的例子中,我沒有任何類型的輸入提交ios鍵盤按鈕將無法正常工作。 –

+0

感謝您的回覆。正如你的例子要求OP爲了防止移動平臺上的提交問題而避免使用'input type =「submit」/>'而不是'',這不像你指出一個合適的跨平臺解決方案;您也正在對OP進行不必要的設計約束。除非另有說明,否則最好假設他們也希望支持移動平臺。因此它不能被吹捧爲「最好的解決方案是給你的」。你的回答促進了不好的行爲,直到它更新更合適我無法刪除我的downvote。 – Scott

相關問題