JavaScript clearTimeout返回未定义的
有人能解释一下我下面的代码有什么问题吗?我声明一个公共变量并将其设置为setTimeout,如果不是null,则在再次设置之前清除超时。当我试图清除超时时,我没有定义超时,因此超时将继续运行JavaScript clearTimeout返回未定义的,javascript,jquery,ajax,settimeout,onkeyup,Javascript,Jquery,Ajax,Settimeout,Onkeyup,有人能解释一下我下面的代码有什么问题吗?我声明一个公共变量并将其设置为setTimeout,如果不是null,则在再次设置之前清除超时。当我试图清除超时时,我没有定义超时,因此超时将继续运行 var usernameCheckTimeout = null; $(document).ready(function(){ $("#username").on("keyup", function(e){ if($(this).val().length >= 6)
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);
});
};
正在清除超时。问题是您正在立即调用函数,而不是将函数传递给
setTimeout
setTimeout(isUsernameAvailable($(this).val()), 1000);
将调用isUsernameAvailable($(this).val()),此调用的结果将传递给setTimeout
setTimeout(isUsernameAvailable($(this).val()), 1000);
您应该传递一个调用此函数的函数:
编辑:正如@Mark所说,您还需要处理这个不是您所期望的:
var value = $(this).val();
setTimeout(function(){
isUsernameAvailable(value)
}, 1000);
正在清除超时。问题是您正在立即调用函数,而不是将函数传递给setTimeout
setTimeout(isUsernameAvailable($(this).val()), 1000);
将调用isUsernameAvailable($(this).val())
,此调用的结果将传递给setTimeout
setTimeout(isUsernameAvailable($(this).val()), 1000);
您应该传递一个调用此函数的函数:
编辑:正如@Mark所说,您还需要处理这个不是您所期望的:
var value = $(this).val();
setTimeout(function(){
isUsernameAvailable(value)
}, 1000);
您不需要执行空检查,还需要围绕此
创建一个闭包,否则此
将不会引用您认为的此
实际是什么
var usernameCheckTimeout;
$("#username").on("keyup", function (e) {
if ($(this).val().length >= 6) {
clearTimeout(usernameCheckTimeout);
var that = this;
usernameCheckTimeout = setTimeout(function () {
isUsernameAvailable($(that).val();
}, 1000);
}
});
有些人喜欢像往常一样。你不需要做空检查,你也需要在这个
周围创建一个闭包,否则这个
将不是你认为的这个
实际上是什么
var usernameCheckTimeout;
$("#username").on("keyup", function (e) {
if ($(this).val().length >= 6) {
clearTimeout(usernameCheckTimeout);
var that = this;
usernameCheckTimeout = setTimeout(function () {
isUsernameAvailable($(that).val();
}, 1000);
}
});
有些人像往常一样爱你。你有几个问题。第一个问题非常严重,即您正在立即执行isUsernameAvailable($(this).val())
,并将返回值传递给setTimeout
-您需要将其移动到匿名函数中,以便在超时调用匿名函数之前不会执行:
usernameCheckTimeout = setTimeout(function () {
isUsernameAvailable($(this).val());
}, 1000);
javascript超时函数依赖于数字ID来运行。您应该避免测试null
或未定义
或任何其他内容,而是测试一个数字:
// leave it as undefined
var usernameCheckTimeout;
...
if (typeof usernameCheckTimeout === 'number') {
clearTimeout(usernameCheckTimeout);
}
你有几个问题。第一个问题非常严重,即您正在立即执行isUsernameAvailable($(this).val())
,并将返回值传递给setTimeout
-您需要将其移动到匿名函数中,以便在超时调用匿名函数之前不会执行:
usernameCheckTimeout = setTimeout(function () {
isUsernameAvailable($(this).val());
}, 1000);
javascript超时函数依赖于数字ID来运行。您应该避免测试null
或未定义
或任何其他内容,而是测试一个数字:
// leave it as undefined
var usernameCheckTimeout;
...
if (typeof usernameCheckTimeout === 'number') {
clearTimeout(usernameCheckTimeout);
}
谢谢你。回答正确,但只比@James Montagney晚几分钟。回答正确,但只比@James Montagne晚几分钟