2009-05-15 178 views
4

在validateUsername函數有可能在服務器端完成用戶名檢查之前,表單提交時出現問題。如何在提交表單之前等待ajax驗證完成?

如何在validateUsername函數完成後才提交表單? 希望這個很清楚...

form.submit(function(){ 
    if (validateUsername() & validateEmail() & validatePassword()) { 
     return true; 
    } else { 
     return false; 
    } 
});   

function validateUsername(){    
    usernameInfo.addClass("sign_up_drill"); 
    usernameInfo.text("checking..."); 
    var b = username.val(); 
    var filter = /^[a-zA-Z0-9_]+$/;  
    $.post("../username_check.php",{su_username:username.val()},function(data) { 
     if (data=='yes') { 
      username.addClass("error"); 
      usernameInfo.text("sorry, that one's taken"); 
      usernameInfo.addClass("error"); 
      return false;   
     } else if (!filter.test(b)) { 
      username.addClass("error"); 
      usernameInfo.text("no funny characters please"); 
      usernameInfo.addClass("error"); 
      return false; 
     } else { 
      username.removeClass("error"); 
      usernameInfo.text("ok"); 
      usernameInfo.removeClass("error");  
      return true;  
     } 
    });    
} 
+1

哇我frickin喜歡這個網站!感謝您的快速和簡潔的回覆。我打算保留客戶端正則表達式驗證,但在提交時將用戶名檢查移到服務器端。 – Jung

+0

從頭開始......遵循Adam和Pim Jager的建議,將form.submit轉換爲submit.click,而不是返回true,創建一個變量usernameIsOkay = true; submit.click(函數(){ validateUsername();如果 (usernameIsOkay){ form.submit();} }); – Jung

回答

7

Olafur答案的更詳細版本 - AJAX調用已完成,函數無需等待即可返回。

直到您提交表單,回調纔會完成。

你應該做的是讓按鈕/觸發器調用AJAX驗證,回調應該提交表單而不是返回true。

+2

是的。 Jung正在尋找:$('#button')。click(function(){$ .post(.... function(){if(stuff)$('#form')。submit();}); –

0

你不能在AJAX調用中返回。我建議你閱讀jQuery FAQ的this section。特別是關於回調的部分。 (最後一段代碼)

-1

我建議有

1)在你的窗體中的隱藏字段。
2)在調用任何發出AJAX請求的函數之前,將它的值設置爲0。
3)當每個函數成功驗證時遞增值。
4)在檢查此隱藏字段的值之前,設置一些秒數(即,完成所有AJAX請求所需的時間量/超時時間+幾秒)。 檢查值是否爲3(如果有3個AJAX調用需要驗證),然後讓它提交。

我想,當控件失去焦點的時候進行驗證會更好。僅當所有控件通過驗證時啓用提交按鈕。

對不起,我不太熟悉JQuery,但我會這樣做,如果我要使用普通的JavaScript。

2

jQuery form validation plugin照顧你這個 - 我強烈推薦它。

一些示例代碼:

$("#myform").validate({ 
    rules: { 
    email: { 
     required: true, 
     email: true 
    }, 
    username: { 
     required: true, 
     remote: { 
     url: "../username_check.php", 
     type: "post", 
     } 
     } 
    } 
    } 
}); 
1

在jQuery中存在針對相同的溶液。我需要在某個JavaScript期間檢查用戶是否存在於我的應用程序中。下面是代碼:

var pars = "username="+ username; 
var some = $.ajax({url: 'AjaxUserNameExist.php', 
    type: 'GET', 
    data: pars, 
    async: false 
}).responseText; 


if(some=="1") //this is value Got from PHP 
{ 
    alert("We cannot Go"); 
    return false; 
} 

if(some=="0") 
{ 
    alert("We can Go"); 
    return true; 
} 
+0

通常人們對瀏覽器中使用同步邏輯感到不滿,但是在onsubmit回調的情況下,這似乎是合理的。 –

0

你爲什麼不只是使用$('#yourFormId').submit();您從阿賈克斯後端收到結果後?

+0

因爲如果在onsubmit事件中,那麼它會進入一個無限循環 –

1

我最近處理了一個類似的問題。在某些情況下,在輸入字段上按回車可能會使表單提交。我試圖用多種方法對此進行補救,然後更改所需的規格,以便按下Enter鍵或Go在設備上,將允許提交表單。我的解決方案正是當時對我有意義的。

var form_submit = false; 

function validateInput() { 

    var field_value = $('#username').val(); 

    $.post('validation.php', {'input': field_value }, function (d) { 
     if (d.valid) { 

      form_submit = true; 
      $('form').submit(); 

     } else { 

      //error message or whatever 

     } 
    }, 'json'); 

} 

$('form').submit(function() { 

    if (form_submit) { 
     return true; 
    } else { 
     validateInput(); 
     return false; 
    } 

}); 
相關問題