2013-01-09 49 views
2

我想驗證表單,以便我可以檢查基本信息(例如輸入的用戶名,用戶名最小長度等),但也可以確保像用戶名和電子郵件的東西還沒有(這需要數據庫搜索)。

我擁有所有的作品,並且在玩過後縮小了範圍,發現$.post聲明雖然是爲了添加到我的「失敗」計數器中,但並未這樣做。我如何從$.post行獲得某種形式的輸出,以便我可以真正驗證(因爲現在即使用戶名不可用,它也會提交表單)。

這是我的<script>(儘管爲了簡單起見,縮寫爲只顯示用戶名片)。請注意,「usernameoff」是我的錯誤塊:

function validateForm() 
{ 
    // set variables 
    var username=document.forms["registrationnew"]["username"].value; 
    var usernamespace=username.indexOf(" "); 

    // set fail counter variable to determine if any requirements failed 
    var counter=0; 

    // check that username isn't blank, containing spaces, too short, or taken 
    if (username==null || username=="") 
    { 
     counter++; 
     $('#usernameoff').html("Must enter a username"); 
    } 
    else if (username.indexOf(" ") >= 0) 
    { 
     counter++; 
     $('#usernameoff').html("Cannot contain spaces"); 
    } 
    else if (username.length < 3) 
    { 
     counter++; 
     $('#usernameoff').html("Must be at least three characters"); 
    } 
    else 
    { 
     $.post("check_username.php", {username: username}, function(result) 
     { 
     if(result == 0) 
     { 
      $('#usernameoff').html("Available"); 
     } 
     else 
     { 
      counter++; 
      $('#usernameoff').html("Not available"); 
     } 
     }); 
    } 

    // if any test failed, return false 
    if (counter > 0) 
    { 
     document.getElementById("errorflag").innerHTML=counter; 
     return false; 
    } 
} 

$.post進行查詢,以確定是否輸入的用戶名已被佔用(並返回0或1)。我的問題是,無論它返回什麼,它都不會增加「計數器」,因此表單仍然提交。

回答

1

您的最終測試(if (counter > 0))將在您的AJAX調用返回之前運行。這是AJAX的'異步'部分。

最簡單的解決方案,你的情況,是一個同步調用替換$.post

$.ajax({ 
    type: "POST", 
    url: "check_username.php", 
    data: {'username': username}, 
    async: false, 
    success: function(result) { /* ... */ } 
}); 

,而你的腳本等待返回這將導致延遲,但因爲它是你自己的服務器上,這延遲應該相當小。

(同步調用是不可能的。閱讀.ajax()的文檔的更多。)

+0

太感謝你了,昨天這個問題害了我,我只是嘗試了一下這種方式取得成功。我正在編寫我的第一個網站(參加了一個學期的編碼課程並發現了錯誤),所以這是一個很大的學習經驗。再次感謝。 – cschippe