0

有人可以向我解释我下面的代码有什么问题吗?我正在声明一个公共变量并将其设置为 setTimeout,如果不为空,则在再次设置之前清除超时。当我尝试清除超时时,我得到未定义,因此超时继续运行。

var usernameCheckTimeout = null;

$(document).ready(function(){
    $("#username").on("keyup", function(e){ 
        if($(this).val().length >= 6)
        {
            if(usernameCheckTimeout != null)
            {
                clearTimeout(usernameCheckTimeout);
            }
            usernameCheckTimeout = setTimeout(isUsernameAvailable($(this).val()), 1000);
        }
    });
});

function isUsernameAvailable(username)
{
    $.ajax({
        url : "/account/username-check",
        method : "POST",
        dataType : 'json',
        data : {
            'username' : username
        }
    }).done(function(data) {
        console.log(data);
    });
};
4

3 回答 3

3

您不需要进行 null 检查,也需要在 周围创建一个闭包this,否则this将指代不是您认为this的实际情况。

var usernameCheckTimeout;
$("#username").on("keyup", function (e) {
    if ($(this).val().length >= 6) {
        clearTimeout(usernameCheckTimeout);
        var that = this;
        usernameCheckTimeout = setTimeout(function () {
            isUsernameAvailable($(that).val();
        }, 1000);
    }
});

像往常一样喜欢一些jsfiddle 。

于 2013-03-29T14:20:55.067 回答
2

正在清除超时。问题是您立即调用函数而不是将函数传递给setTimeout.

setTimeout(isUsernameAvailable($(this).val()), 1000);

isUsernameAvailable($(this).val())将被调用并且此调用的结果将被传递给setTimeout.

您应该传递一个调用此函数的函数:

编辑:正如@Mark 所说,你还需要处理this不是你所期望的:

var value = $(this).val();

setTimeout(function(){
    isUsernameAvailable(value)
}, 1000);
于 2013-03-29T14:19:02.817 回答
1

你有几个问题。第一个很大的问题是您正在立即执行 isUsernameAvailable($(this).val())并将返回值传递给setTimeout-您需要将其移动到匿名函数中,以便在超时调用匿名函数之前它不会执行:

usernameCheckTimeout = setTimeout(function () {
    isUsernameAvailable($(this).val());
}, 1000);

javascript 超时函数依赖于数字 ID 来运行。您应该避免测试nullorundefined或其他任何东西,而是测试一个数字:

// leave it as undefined
var usernameCheckTimeout;

...

if (typeof usernameCheckTimeout === 'number') {
    clearTimeout(usernameCheckTimeout);
}
于 2013-03-29T14:22:05.283 回答