使用ajax post实时验证用户名和电子邮件地址


real time validation of username and email address using ajax post

我设置了一个简单的表单,并使用ajax+jquery来检查有效的用户名(在数据库中不存在)和电子邮件地址(有效的格式,在数据库中也不存在),如下

<body>
<div>
<h5> Sign Up </h5>
<hr />
<div>
    Username:<input type="text" size="32" name="membername" id="username"><div id="usernameStatus"></div><br />
    Email:<input type="text" size="32" name="memberemail" id="memberemail"><div id="emailStatus"></div><br/>
    Password:<input type="password" size="32" name="memberpwd"><br />
    <button id="signup"  disabled="true">Sign Up</button>   
</div>  
<script>    
    function IsEmailValidAndNew()
    {
         var pattern = new RegExp(/^(("['w-+'s]+")|(['w-+]+(?:'.['w-+]+)*)|("['w-+'s]+")(['w-+]+(?:'.['w-+]+)*))(@((?:['w-+]+'.)*'w['w-+]{0,66})'.([a-z]{2,6}(?:'.[a-z]{2})?)$)|(@'[?((25[0-5]'.|2[0-4]['d]'.|1['d]{2}'.|
['d]{1,2}'.))((25[0-5]|2[0-4]['d]|1['d]{2}|['d]{1,2})'.){2}(25[0-5]|2[0-4]['d]|1['d]{2}|['d]{1,2})']?$)/i);
        var success=false;
        $("#memberemail").change(function()
        {
            var email=$("#memberemail").val();
            success=patter.test(email);
            if(success)
            {
                $("#usernameStatus").html('<img align="absmiddle" src="loading.gif"/> Checking email...');
                $.ajax(
                {
                    type: "POST",
                    url:"regcheckemail.php",
                    data:"memberemail="+email,  
                    success: function(msg)
                    {
                        $("#emailStatus").ajaxComplete(function(event, request, settings)
                        {
                            if(msg=="OK")
                            {
                                $("#memberemail").removeClass("object_error");
                                $("#memberemail").addClass("object_ok");
                                $(this).html('<img align="absmiddle" src="checkmark.png"/>');
                                success=true;
                            }
                            else
                            {
                                $("#memberemail").removeClass('object_ok'); 
                                $("#memberemail").addClass("object_error");
                                $(this).html(msg);
                                success=false;
                            }
                        }
                        );
                    }
                }
                );
            }
            else
            {
                $("#emailStatus").html("Provided email address is ill-formed");
                $("#memberemail").removeClass('object_ok'); // if necessary
                $("#memberemail").addClass("object_error");
                success=false;
            }
        }
        );
        return success;
    }
    function IsUserAlreadyExist()
    {
        var success=false;
        $("#username").change(function()
        {
            var usr=$("#username").val();
            if(usr.length>=7)
            {
                $("#usernameStatus").html('<img align="absmiddle" src="loading.gif"/> Checking availability...');
                $.ajax(
                {
                    type: "POST",
                    url:"regcheckuser.php",
                    data:"username="+usr,   
                    success: function(msg)
                    {
                        $("#usernameStatus").ajaxComplete(function(event, request, settings)
                        {
                            if(msg=="OK")
                            {
                                $("#username").removeClass("object_error");
                                $("#username").addClass("object_ok");
                                $(this).html('<img align="absmiddle" src="checkmark.png"/>');
                                success=true;
                            }
                            else
                            {
                                $("#username").removeClass('object_ok'); 
                                $("#username").addClass("object_error");
                                $(this).html(msg);
                                success=false;
                            }
                        }
                        );
                    }
                }
                );
            }
            else
            {
                $("#usernameStatus").html("The username should have at least 7 characters");
                $("#username").removeClass('object_ok'); 
                $("#username").addClass("object_error");
                success=false;
            }
        });
        return success;
    }
    $(document).ready(function()
    {       
        if(IsEmailValidAndNew() && IsUserAlreadyExist())
        {
            $('button').find("#signup").attr("disabled","false");
        }
        else
        {
            $('button').find("#signup").attr("disabled","true");    
        }           
    });
</script>
</div>
</body>

我用记事本给它编码,它不起作用,我找不出错误。我不知道有什么好的工具可以用来用javascript编码,它有很棒的选项,比如嵌入式智能感知和调试功能。

您的代码有几个问题。

  1. 您的电子邮件正则表达式不够彻底(好吧,这实际上并没有停止代码的工作,但这是我注意到的第一件事)
  2. 您的ajax调用是异步的,这很好,但意味着执行$.ajax()调用的函数将在收到ajax响应之前完成。您需要对其进行重组,以便从ajax成功回调中执行某些操作
  3. 您不需要ajaxComplete()函数——此时您已经在ajax成功处理程序中了,所以将当前ajaxComplete()中的代码直接放在包含成功函数中
  4. 您从文档就绪状态调用IsEmailValidAndNew()IsUserAlreadyExist()一次,然后禁用或启用"注册"控件,但在此之后,您再也不会重新启用或禁用它。您调用这些函数,就好像它们将验证字段一样,但实际上,他们所做的是在字段上设置更改处理程序,这样在用户真正更改字段之前,函数中的代码就不会做任何事情

以下是一种可以构建代码的方法:

$(document).ready(function() {
    var emailOK = false,
        nameOK = false;
    function setSubmitEnabling() {
       $("#signup").prop("disabled", !(emailOK && nameOK));
    }
    setSubmitEnabling();
    $("#username").change(function() {
       var usr = $(this).val();
       if (usr.length < 7) {
           $("#usernameStatus").html("The username should have at least 7 characters");
           $(this).removeClass('object_ok').addClass("object_error");
           nameOK = false;
           setSubmitEnabling();
       } else {
           // format seems OK, so do ajax call:
           $("#usernameStatus").html('<img align="absmiddle" src="loading.gif"/> Checking availability...');
           $.ajax({
               type: "POST",
               url:"regcheckuser.php",
               data:"username="+usr,
               success : function(msg) {
                  if(msg === "OK")
                  {
                      $("#username").removeClass("object_error")
                                    .addClass("object_ok");
                      $("#usernameStatus").html('<img align="absmiddle" src="checkmark.png"/>');
                      nameOK = true;
                  }
                  else
                  {
                      $("#username").removeClass('object_ok')
                                    .addClass("object_error");
                      $("#usernameStatus").html(msg);
                      nameOK = false;
                  }
                  // now update button state
                  setSubmitEnabling();
               }
           });
       }
    });
    $("#memberemail").change(function() {
       // basically the same thing as for the username field as shown above,
       // except setting emailOK instead of nameOK, so I suggest you get the
       // username part working first then come back to do this the same way
    });
});

上面代码的想法是,有几个点需要启用或禁用"注册"按钮,这取决于两个不相关的条件。因此,为这些条件中的每一个创建一个标志,并使用函数setSubmitEnabling()来检查标志并启用或禁用按钮。当页面加载时立即调用该函数以设置初始启用/禁用状态,并在需要重新评估启用/禁用态的任何更改时再次调用该函数。

另外,为两个字段中的每一个字段创建一个更改处理程序。更改处理程序将彼此相似,基本上是进行一些初始的快速验证,看看长度和格式是否可以,如果可以,则进行ajax调用以测试唯一性。

相关文章: