为什么javascript在输入时立即发送事件,而不是在5秒延迟后发送

Why javascript sends event immidiatelly when typing but not after 5 sec delay?

本文关键字:5秒 延迟 事件 javascript 为什么 输入      更新时间:2023-09-26
<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>       

您立即调用该函数,并将其结果(未定义)传递给setTimeout()。您需要向setTimeout()传递一个函数引用,在本例中,您可以通过删除doneTyping:之后的括号来完成此操作

typingTimer = setTimeout(doneTyping, doneTypingInterval);

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

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

在线演示

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