Jquery表单插件(添加ajax表单验证)

时间:2009-01-21 06:34:20

标签: jquery

我正在创建一个通过Jquery表单插件提交的注册表单。我试图通过带有后端php文件的ajax验证表单字段。这是我的Javascript。它只有在我将其设置为返回false时才会起作用,无论它是什么,否则它会在没有验证的情况下提交它,如果我将其返回true。

$(document).ready(function(){
    $(".close_pop").click(function(){
        $("#rc").fadeOut("slow");
    });

    var options = { 
        target:        '.container',
        beforeSubmit: validate    
    }; 
    $('#register_form_id').submit(function() { 
        // inside event callbacks 'this' is the DOM element so we first 
        // wrap it in a jQuery object and then invoke ajaxSubmit 
        $(this).ajaxSubmit(options); 
        // !!! Important !!! 
        // always return false to prevent standard browser submit and page navigation 
        return false; 
    });
}); 
function validate(formData, jqForm, options) { 
    var fn = $('input[@name=first_name]').fieldValue(); 
    var ln = $('input[@name=last_name]').fieldValue(); 
    var e = $('input[@name=maile]').fieldValue(); 
    var p = $('input[@name=pass]').fieldValue();
    var url = "/register/validate?first=" + fn + "&last=" + ln + "&email=" + e + "&pass=" + p; 
    if (!fn[0]) { 
        $("#fn").focus();
        $(".error").fadeIn("slow");
        $(".error").html("Please enter your first name.");
        return false;
    }
    if (!ln[0]) { 
        $("#ln").focus();
        $(".error").fadeIn("slow");
        $(".error").html("Please enter your last name.");
        return false;
    }
    if (!e[0]) { 
        $("#e").focus();
        $(".error").fadeIn("slow");
        $(".error").html("Please enter a valid email address (e.g. name@domain.com.)");
        return false;
    }
    if (!p[0]) { 
        $("#p").focus();
        $(".error").fadeIn("slow");
        $(".error").html("Please enter a valid password (It must be at least 6 characters.)");
        return false;
    }       
     $.get(url , 
        function(data){
        if(data == 'ng') {
            $(".error").fadeIn("slow");
            $(".error").html("We are experiencing technical issues. Please try again later.");
            return false;
        } else if(data == 'f') {
            $("#fn").focus();
            $(".error").fadeIn("slow");
            $(".error").html("Please enter your first name.");
            return false;
        } else if(data == 'l') {
            $("#ln").focus();
            $(".error").fadeIn("slow");
            $(".error").html("Please enter your last name.");
            return false;
        } else if(data == 'e') {
            $("#e").focus();
            $(".error").fadeIn("slow");
            $(".error").html("Please enter a valid email address (e.g. name@domain.com.)");
            return false;
        } else if(data == 'e_u') {
            $("#e").focus();
            $(".error").fadeIn("slow");
            $(".error").html("This email address appears to be registered.");
            alert(data);
            return false;
        } else if(data == 'p') {
            $("#p").focus();
            $(".error").fadeIn("slow");
            $(".error").html("Please enter a valid password (It must be at least 6 characters.)");
            return false;
        } else if(data == 'y') {
            return true;
        } else {
            return false;
        }
      });
      return false;
}

如果遇到问题,那么php文件会回复某些关键字或字母。如果它顺利运行它回声'y'。

正如我上面所说,我需要它在数据等于y时返回true,但事实并非如此。它验证的唯一方法是,如果我保留第二行到最后一行“return false;”否则它提交过我的php后端。我没有遇到if(!var [0]){的任何问题 函数,这不是一个问题。

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

您可以查看jQuery Validator plugin,它为您提供了许多验证选项,包括AJAX调用。

答案 1 :(得分:0)

这是因为您使用validate函数就好像它是同步操作一样。但是.get方法是异步的,这意味着函数不会等待xhr方法返回,而是总是会丢失并返回false。您可以使用.ajax方法调用并将其标记为异步:false然而这是不好的,因为它为用户锁定了ui,并且如果由于某种原因xhr无法返回,则客户端浏览器将无效,除非您取消通过xhr超时调用 - 但这种方法不是我建议的。

因为没法尝试validate plugin。作者提到complexities of of synchronus ajax validation以及插件如何帮助您避免担心它。

  

Ajax有助于缩小差距,但是   在表单上同步验证   提交并不是一件容易的事。该   验证插件使它变得简单   作为纯客户端验证。所有   您需要做的是指定规则   “远程”为一个字段并提供一个   指向服务器端的参数   处理验证的资源。