0
<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>       
4

1 回答 1

6

您正在立即调用该函数并将其结果(未定义)传递给setTimeout(). 您需要将函数引用传递给setTimeout(),在这种情况下,您可以通过删除 之后的括号来完成doneTyping

typingTimer = setTimeout(doneTyping, doneTypingInterval);

或者(不适用于您的示例,但供将来参考),如果您需要调用带有一些参数的函数,假设您想doneTyping('test')在指定的时间间隔后调用,您可以将其包装在匿名函数表达式中:

typingTimer = setTimeout(function() { doneTyping('test'); }, doneTypingInterval);

ONLINE DEMO

PS 与您所要求的内容间接相关,我建议您也将其clearTimeout()移入keyup处理程序,就在之前setTimeout(),并删除keydown处理程序,类似这样,否则您可能会发现一次设置了两个或多个超时,因为要键入大写字母的顺序是 (1) 下移 (2) 字母下移 (3) 字母上移 (4) 上移。同样,即使不使用 shift 键,当快速打字时,我经常发现在输入下一个字母之前我还没有完全释放一个键,所以我keydown在相应事件之前连续收到多个keyup事件 - 这在正常情况下没有明显的不良影响情况下,但是当代码同时响应 down 和 up 事件时会很明显。

于 2013-07-13T12:10:14.377 回答