关于用户名验证的JQuery .ajax()

时间:2011-01-11 17:54:33

标签: php javascript jquery

我试图使用以下代码验证用户名是否存在。但它在某种程度上无法阻止现有的用户名。 **注意:checkusr2.php是一个简单的php来检查数据库中的用户名。

function verifyUser() {
    var usr = $("#username").val();
    $.ajax( {  
        type: "POST",  
        url: "checkusr2.php",  
        data: "username="+ usr,  
        success: function(msg) {
            $("#txtHint").ajaxComplete(function(event, request, settings){
                FormErrors = false;
                if(msg == 'OK') {
                    FormErrors = true;
                    $('#formElem').data('username',FormErrors); 
                } else {
                    $('#formElem').data('username',FormErrors);
                }
            });
        }
    });
}

/ **调用要检查的函数。 ** /

verifyUser();
if($('#formElem').data('username')){
    alert('Username exist, please try another username.');
    return false;
}

4 个答案:

答案 0 :(得分:1)

使用像Charles,Fiddler,WireShark等的http代理来查看您发送的ajax请求,并验证响应是否符合预期。

首先,您正在进行异步调用(Ajax中的A)以获取用户名是否存在的响应。一旦调用verifyUser,就会立即调用verifyUser调用之后的check,并且checkusr2.php的请求可能已经或者可能没有实际返回。

我也从未在成功处理程序中看到过ajaxComplete。我想你可能想改变它:

function verifyUser() {
    var usr = $("#username").val();
    $.ajax( {  
        type: "POST",  
        url: "checkusr2.php",  
        data: "username="+ usr,  
        success: function(msg) {
            if(msg != 'OK') {
                alert('Username exists, please try another username.');
                $("#username").val("");
            }
        };

    });
}

答案 1 :(得分:0)

您的问题是尝试同步使用verifyUser。代码似乎相当合理,问题是$ .ajax使用XMLHTTPRequest异步执行。这意味着紧跟调用verifyUser之后的代码不能依赖于其完成的副作用。

您需要做的是提前运行verifyUser回调(例如,当用户取消对焦用户名字段时),以便在提交时您已经获得结果。

例如:

$('#username').blur(function() { verifyUser() });

进一步的更改不是阻止提交,而是当用户名无效时,您可以使verifyUser在字段旁边显示带有消息的div。您将对处理程序进行以下更改:

            if(msg == 'OK') {
                FormErrors = true;
                $('#username_invalid').show();
            } else {
                $('#username_invalid').hide();
            }

然后您可以向用户显示无法立即选择用户名,而不会浪费时间提交用户名。

答案 2 :(得分:0)

试试这个

$("#txtHint").ajaxComplete(function(e, xhr, settings) {
  if (settings.url == 'ajax/test.html' && xhr.responseHTML=="Ok") {
                FormErrors = true;
                $('#formElem').data('username',FormErrors); 
            } else {
                $('#formElem').data('username',FormErrors);
            }
})

答案 3 :(得分:0)

感谢您提出我不知道的.ajaxComplete()。我认为将来对我有很大的帮助 但无论如何,我不认为这是你想要在这个特定情况下使用的:

function verifyUser() {
  var usr = $("#username").val();
  $.ajax( {  
    type: "POST",  
    url: "checkusr2.php",  
    data: {'username':usr},  
    success: function(msg) {
      if ( msg != 'OK' ) {
         alert('Username exist, please try another username.');
         return false;
      }
    });
  });
}

在Ajax调用之后要执行的函数必须作为Ajax函数的回调传递,否则,即使你把它放在Ajax函数之后,它也会在服务器响应之前执行。