提问人:Jung 提问时间:5/15/2009 更新时间:4/16/2013 访问量:23222
如何等待ajax验证完成再提交表单?
How to wait for ajax validation to complete before submitting a form?
问:
在validateUsername函数有机会在服务器端完成用户名检查之前,表单提交时出现问题。
如何在 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;
}
});
}
答:
不能在 AJAX 调用中返回。我建议您阅读jQuery常见问题解答的这一部分。特别是关于回调的部分。(最后一个代码片段)
Olafur 回答的更详细版本 - 进行 AJAX 调用,函数返回,无需等待。
在提交表单之前,回调不会完成。
您应该做的是让按钮/触发器调用 AJAX 验证,并且回调应提交表单而不是返回 true。
评论
我建议有
1)表单中的隐藏字段。
2) 在调用发出 AJAX 请求的任何函数之前,将其值设置为 0。
3) 当每个函数成功验证时,增加该值。
4)在检查此隐藏字段的值之前设置一些秒数(即完成所有AJAX请求所需的时间/超时+几秒钟)以等待。
检查值是否为 3(如果有 3 个 AJAX 调用进行验证),然后让它提交。
我想,当控件失去焦点时进行验证会更好。仅当所有控件都通过验证时,才启用提交按钮。
抱歉,我对 JQuery 不太熟悉,但如果我使用普通的 javascript,我会这样做。
jQuery表单验证插件会为您解决这个问题 - 我强烈推荐它。
一些示例代码:
$("#myform").validate({
rules: {
email: {
required: true,
email: true
},
username: {
required: true,
remote: {
url: "../username_check.php",
type: "post",
}
}
}
}
});
在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;
}
评论
为什么不在收到 ajax 后端的结果后再使用呢?$('#yourFormId').submit();
评论
我最近处理了一个类似的问题。在某些情况下,在输入字段上按 Enter 键可能会使表单提交。我试图通过多种方式解决这个问题,然后更改了所需的规范,以便在设备上按 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;
}
});
评论