如何在提交表单之前等待ajax验证完成?

时间:2009-05-15 01:27:17

标签: jquery ajax validation

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

7 个答案:

答案 0 :(得分:8)

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

在您提交表单之前,回调无​​法完成。

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

答案 1 :(得分:2)

jQuery form validation plugin会为您解决此问题 - 我强烈推荐它。

一些示例代码:

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

答案 2 :(得分: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;
}   

答案 3 :(得分:1)

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

});

答案 4 :(得分:0)

您无法在AJAX通话中返回。我建议你阅读jQuery FAQ的this section。特别是关于回调的部分。 (最后一个代码段)

答案 5 :(得分:-1)

我建议

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

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

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

答案 6 :(得分:-1)

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