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()し、このようなハンドラーを削除することもお勧めします。大文字のシーケンスは、(1) シフトダウン (2) 文字ダウン (3) 文字アップ (4) シフトアップです。また、Shift キーを使用しなくても、すばやく入力すると、次の文字を入力する前にキーを完全に離していないことがよくあります。そのため、対応するイベントの前に複数のイベントが連続して発生します。通常、これは顕著な悪影響はありません。ただし、ダウン イベントとアップ イベントの両方に応答するコードがある場合は顕著です。keyupsetTimeout()keydownkeydownkeyup

于 2013-07-13T12:10:14.377 に答える