jQuery keyup检查密码很慢

时间:2012-11-26 12:39:18

标签: jquery

我希望有人能帮我解决以下问题。我有一个密码输入框,用户输入密码,并使用以下代码自动检查他们的密码

 $('input[name=currentpassword]').keyup(function(){
                var currentcheck = $(this).val();
                var dataString='thisConfirm='+ currentcheck +'&userid='+$('input[name=userid]').val();
                PasswordChecking=   $.ajax({
                                        type:"POST",
                                        url:"/assets/inc/password-check.php",
                                        data:dataString,
                                        dataType:'html',
                                        context:document.body,
                                        global:false,
                                        async:false,
                                        success:function(data){
                                            return data}
                                            }).responseText;
                    checkconfirms(emailconfirm, passconfirm, PasswordChecking);
        });

但是我注意到的是每个键之间有一个延迟,并且希望有一种方法或替代方法来检查输入的密码,因为每个键击都会延迟,或者直到Ajax返回

3 个答案:

答案 0 :(得分:4)

您需要的是一个取消ajax请求的超时,以便在用户输入快速时不检查每个keyup上的密码,但仅在用户输入完成时才检查密码。此外,您应该使用异步调用来避免锁定浏览器,如下所示:

$('input[name=currentpassword]').on('keyup', function() {
    var data = {thisConfirm : this.value, userid: $('input[name=userid]').val()};

    clearTimeout($(this).data('timer'));

    $(this).data('timer', setTimeout(function() {
        $.ajax({
            type: "POST",
            url: "/assets/inc/password-check.php",
            data: data,
            dataType: 'html',
            context: document.body,
            global: false,
        }).done(function() {
            checkconfirms(emailconfirm, passconfirm, PasswordChecking);
        })
    },400);
});​

答案 1 :(得分:1)

正如Adil建议的那样,使用blurfocusout事件是一种选择。另一种方法是使用setTimeout()来延迟检查密码,这样就不会在每次击键时发送AJAX请求。而是在他们停止输入该输入后X秒发送一个AJAX请求。

var checkPassword;
$('input[name=currentpassword]').keyup(function() {
    clearTimeout(checkPassword);
    checkPassword = setTimeout(function() {verifyPassword(this)}, 1000); // this would delay calling verifyPassword() by 1 second
});

function verifyPassword(element) {
    var currentcheck = element.value;
    // do your AJAX call here
});

答案 2 :(得分:0)

您正在使用async:false,,对于异步调用应该为true。我建议你检查jquery事件 focusout() 上的密码,而不是密钥。

$('input[name=currentpassword]').focusout(function(){
            var currentcheck = $(this).val();
            var dataString='thisConfirm='+ currentcheck +'&userid='+$('input[name=userid]').val();
            PasswordChecking=   $.ajax({
                                        type:"POST",
                                        url:"/assets/inc/password-check.php",
                                        data:dataString,
                                        dataType:'html',
                                        context:document.body,
                                        global:false,
                                       async:true,
                                       success:function(data){
                                        //return data
                                        alert("here you would decide on data for valiadation success");
                                        }
                               }).responseText;
                checkconfirms(emailconfirm, passconfirm, PasswordChecking);
    });
相关问题