如何等待ajax验证完成再提交表单?

How to wait for ajax validation to complete before submitting a form?

提问人:Jung 提问时间:5/15/2009 更新时间:4/16/2013 访问量:23222

问:

在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;    
        }
    });             
}   
jQuery AJAX 验证

评论

1赞 Jung 5/15/2009
哇,我非常喜欢这个网站!感谢您快速简洁的回复。我计划保留客户端正则表达式验证,但在提交时将用户名检查移动到服务器端。
0赞 Jung 5/16/2009
抓挠那个...遵循 Adam 和 Pim Jager 的建议,将 form.submit 切换为 submit.click,而不是返回 true,而是创建了一个变量 usernameIsOkay = true;submit.click(function() { validateUsername(); if (usernameIsOkay) { form.submit();

答:

0赞 Ólafur Waage 5/15/2009 #1

不能在 AJAX 调用中返回。我建议您阅读jQuery常见问题解答的这一部分。特别是关于回调的部分。(最后一个代码片段)

10赞 Adam A 5/15/2009 #2

Olafur 回答的更详细版本 - 进行 AJAX 调用,函数返回,无需等待。

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

您应该做的是让按钮/触发器调用 AJAX 验证,并且回调应提交表单而不是返回 true。

评论

3赞 Pim Jager 5/15/2009
确实是的。荣格正在寻找: $('#button').click( function() { $.post(....function(){ if(stuff) $('#form').submit();
-1赞 shahkalpesh 5/15/2009 #3

我建议有

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

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

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

1赞 Tom Lehman 5/15/2009 #4

jQuery表单验证插件会为您解决这个问题 - 我强烈推荐它。

一些示例代码:

$("#myform").validate({
  rules: {
    email: {
      required: true,
      email: true
    },
    username: {
      required: true,
      remote: {
        url: "../username_check.php",
        type: "post",
        }
      }
    }
  }
});
1赞 Anes P.A 12/14/2009 #5

在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;
}   

评论

2赞 Scott C Wilson 5/23/2013
通常人们不愿意在浏览器中使用同步逻辑,但在(比如)onsubmit 回调的情况下,这似乎是合理的。
0赞 Herbert Van-Vliet 7/27/2021
有些人仍然会皱眉头,然后通过回调继续对提交进行编码;-)
-2赞 Henry 4/30/2010 #6

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

评论

3赞 Timo Huovinen 3/14/2017
因为如果它位于 onsubmit 事件中,那么它就会进入无限循环
1赞 Jordan 3/19/2011 #7

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

});