如何在提交表单之前等待ajaxvalidation完成?

表单在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; } }); } 

更详细的Olafur的答案 – 进行了AJAX调用,函数返回时无需等待。

在您提交表单之前,回调不会完成。

你应该做的是让按钮/触发器调用AJAXvalidation,回调应该提交表单而不是返回true。

jQuery表单validation插件为您解决了这个问题 – 我强烈推荐它。

一些示例代码:

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

我最近处理过类似的问题。 在某些情况下,在输入字段上按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; } }); 

在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调用中返回。 我建议你阅读jQuery FAQ的这一部分 。 特别是关于回调的部分。 (最后一段代码片段)

我建议有

1)表单中的隐藏字段。
2)在调用任何发出AJAX请求的函数之前,将其值设置为0。
3)当每个function成功validation时增加值。
4)在检查此隐藏字段的值之前,设置一些秒数(即完成所有AJAX请求所需的时间/超时时间+几秒)。 检查值是否为3(如果有3个AJAX调用进行validation),然后让它提交。

我想,当控件失去焦点时进行validation会更好。 仅当所有控件都通过validation时才启用提交按钮。

对不起,我不太熟悉JQuery,但如果我使用普通的javascript,我会这样做。

为什么不使用$('#yourFormId').submit(); 从ajax后端收到结果后?