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

时间:2012-01-28 03:47:20

标签: php jquery html ajax

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

<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 个答案:

答案 0 :(得分:3)

您的代码存在一些问题。

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

    $(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调用测试唯一性。