<html>
<head>
<script src="jquery-1.9.0.min.js" type="text/javascript"></script>
</head>
<body>
<input id="input" type="text"/>
<script>
//setup before functions
var typingTimer; //timer identifier
var doneTypingInterval = 5000; //time in ms, 5 second for example
//on keyup, start the countdown
$('#input').keyup(function(){
typingTimer = setTimeout(doneTyping(), doneTypingInterval);
});
//on keydown, clear the countdown
$('#input').keydown(function(){
clearTimeout(typingTimer);
});
//user is "finished typing," do something
function doneTyping () {
alert("123") // I get this alert immidiatelly when typing, but not after 5 sec dalay
}
</script>
</body>
问问题
102 次
1 回答
6
您正在立即调用该函数并将其结果(未定义)传递给setTimeout()
. 您需要将函数引用传递给setTimeout()
,在这种情况下,您可以通过删除 之后的括号来完成doneTyping
:
typingTimer = setTimeout(doneTyping, doneTypingInterval);
或者(不适用于您的示例,但供将来参考),如果您需要调用带有一些参数的函数,假设您想doneTyping('test')
在指定的时间间隔后调用,您可以将其包装在匿名函数表达式中:
typingTimer = setTimeout(function() { doneTyping('test'); }, doneTypingInterval);
PS 与您所要求的内容间接相关,我建议您也将其clearTimeout()
移入keyup
处理程序,就在之前setTimeout()
,并删除keydown
处理程序,类似这样,否则您可能会发现一次设置了两个或多个超时,因为要键入大写字母的顺序是 (1) 下移 (2) 字母下移 (3) 字母上移 (4) 上移。同样,即使不使用 shift 键,当快速打字时,我经常发现在输入下一个字母之前我还没有完全释放一个键,所以我keydown
在相应事件之前连续收到多个keyup
事件 - 这在正常情况下没有明显的不良影响情况下,但是当代码同时响应 down 和 up 事件时会很明显。
于 2013-07-13T12:10:14.377 回答