您可以異步執行此操作。
創建一個全局變量,我把它稱爲ajax_done_and_successful_flag, 你初始化爲false在 程序的開始。您將在您的Ajax函數的各個 位置(如您的Ajax成功 函數或您的Ajax錯誤函數)中將其設置爲true或false。
然後,您需要在 驗證函數的底部添加提交處理程序。
submitHandler: function(form) {
if (ajax_done_and_successful_flag === true) {
form.submit()
}
}
問題是代碼沒有以線性方式執行。
在你的代碼中放入一堆Firebug的console.log語句。
觀察執行的順序。你會看到你的最後回來,或者只要感覺就像它一樣。
這就是爲什麼您需要submitHandler和全局標誌
來強制validate函數在提交表單之前等待正確的Ajax
結果。
的任何輸出從Ajax響應屏幕時, 需要在 Ajax函數來完成,如成功函數和 誤差函數。
您需要寫入相同的位置 作爲驗證函數的成功/錯誤函數。
這樣,Ajax錯誤消息與驗證函數的 錯誤函數混合在一起。
這個概念可能看起來有點棘手。
的想法保持 一點是,在驗證功能 的成功和錯誤功能寫入同一位置,如Ajax調用的成功和錯誤 功能,這是好的,那是多麼 它應該是。
我的錯誤消息的位置正好在 用戶鍵入輸入的位置旁邊。這創造了我認爲您需要的不錯的用戶體驗 。
這是我的代碼示例。我簡化了它。
我運行jQuery的1.7.1
和jQuery驗證插件1.6
我使用Firefox 14.0.1,我也試過 它在Chrome 21.0成功。
var ajax_done_and_successful_flag = false;
// Add methods
...
$.validator.addMethod("USERNAME_NOT_DUPLICATE", function (value, element) {
return this.optional(element) || validate_username_not_duplicate();
},
"Duplicate user name.");
// validate
$(document).ready(function () {
$('#register_entry_form form').validate({
rules: {
username: {
required: true,
minlength: 2,
maxlength: 20,
USERNAME_PATTERN: true,
USERNAME_NOT_DUPLICATE: true
},
...
errorPlacement: function (error, element) {
element.closest("div").find(".reg_entry_error").html(error);
},
success: function(label) {
label.text('Success!');
} ,
submitHandler: function(form) {
if (ajax_done_and_successful_flag === true) {
form.submit();
}
}
});
});
/* validation functions*/
function validate_username_not_duplicate() {
var username_value = $('#username').val(); // whatever is typed in
$.ajax({
url: "check_duplicate_username.php",
type: "POST",
data: { username: username_value },
dataType: "text",
cache: false,
//async: false,
timeout: 5000,
error: function (jqXHR, errorType, errorMessage) {
ajax_done_and_successful_flag = false;
if (errorType === "timeout") {
$('#username').closest("div").find(".reg_entry_error").html("Server timeout, try again later");
} else if ...
},
success: function (retString, textStatus,jqXRH) {
if (retString === "yes") { // duplicate name
// output message next to input field
$('#username').closest("div").find(".reg_entry_error").html("Name already taken.");
ajax_done_and_successful_flag = false;
} else if (retString === "no") { // name is okay
// output message next to input field
$('#username').closest("div").find(".reg_entry_error").html("success!");
ajax_done_and_successful_flag = true;
} else {
console.log("in validate_username_duplicate func, success function, string returned was not yes or no.");
$('#username').closest("div").find(".reg_entry_error").html("There are server problems. Try again later.");
ajax_done_and_successful_flag = false;
}
} // end success function
}); // end ajax call
return true; // automatically return true, the true/false is handled in
// the server side program and then the submit handler
}
reg_entry_error是文本輸入旁邊的地方。 這是一個簡化的表單代碼示例。
<label class="reg_entry_label" for="username">Username</label>
<input class="reg_entry_input" type="text" name="username" id="username" value="" />
<span class="reg_entry_error" id="usernameError" ></span>
我希望這能回答你的問題。
你最終使用了什麼解決方案?我面臨同樣的問題。 –