2012-03-25 14 views
0

jqueryでのこのような試みがありますが、うまくいかないものがあります。たとえば、 'ff'と入力してから別の2つの 'ff'を追加すると、あまりにも多くのコンソールログが発生します。説明するのは難しいですが、コードや実験を実行するとconsole.logが多すぎます。入力が開始されたら、ユーザーが入力をやめるまで3秒ごとに入力ボックスをチェックします。

$("#search-input").keyup(function() { 
     var thisVal = $(this).val(); 
     if(thisVal!=''){ 
      function checker (v){ 
       if($("#search-input").val() !=v){ 
        setTimeout(function(){checker($("#search-input").val())}, 3000); 
       } 
       else{ 
        console.log($("#search-input").val()); 
       } 
      } 
      setTimeout(function(){checker(thisVal)}, 3000); 

     } 
    }); 

検索入力は入力ボックスです。私は実際にconsole.loggingの代わりにajaxを呼び出すことを計画していますが、もし私が上の作業を得ることができれば、私をうまくやってくれます。

+0

_username availability_チェックを実装しますか? –

+0

いいえ、これは単なるajax検索です。私は、Webアプリケーションのフロントエンドに多数のjavascriptが書き込まれているため、新しい文字を入力するたびに検索を開始する必要はありません。 –

答えて

1

前のタイムアウトは、新しいものを設定する前に、クリアする必要があります。

var timeout; 
$("#search-input").keyup(function() { 
    var thisVal = $(this).val(); 
    if (thisVal) { 
     function checker(v) { 
      if($("#search-input").val() != v){ 
       clearTimeout(timeout); 
       timeout = setTimeout(function() { 
        checker($("#search-input").val()); 
       }, 3000); 
      } else { 
       console.log($("#search-input").val()); 
      } 
     } 
     clearTimeout(timeout); 
     timeout = setTimeout(function(){checker(thisVal)}, 3000); 
    } 
}); 
+0

ロブ、私はそれを試みたが、問題は依然として続く。コンソールログの最初のカップルは正常に動作し、同じ入力値の出力を持つ3つのコンソールログが1行で表示されます。例えば1秒間に3'fを追加すると、console.loggedに同じ値が何度か表示されます。何か案は? Btwでは、コードを実行しようとしたときに動作するように、タイムアウトに接頭辞varを付ける必要があります。ありがとう。 –

+0

@Hardworkerいいえ、それを動作させるには 'var'という接頭辞を付けないでください。それがあなたのコードを破るものです。 'var'を前置することによって、現在のスコープ内で変数を宣言しています。 'var'が省略されると、値は変数の最も近い宣言に割り当てられます。これは' var'という接頭辞が付いたものです。文字通り私の答えのコードをコピーして貼り付けると動作します。 –

+0

ありがとうございます。あなたのコードは完璧に動作し、私はあなたの答えを選んでいます。 –

3

簡単な方法は、おそらく、ちょうど彼らが一定時間入力を停止するまでチェックを延期維持することです。つまり、タイマーが実行されている場合はそれをクリアし、後でチェックを再スケジュールします。タイマーの有効期限が切れた場合(すなわち、ユーザがスケジュールされた時間内にボックスに入力していない場合)、チェックを実行する。 3秒はおそらくこれのためには長すぎます。あなたは500msくらいかもしれません。

var timer; // external so it's value is held over all instances of the timer function 
$('#search-input').on('keyup',function() { 
    if (timer) { 
     clearTimeout(timer); 
    } 
    timer = setTimeout(function() { 
     // perform your check 
     console.log($('#search-input').val()); 
    },500); 
}); 
+0

また、非常に良い答えです。 –

関連する問題