質問

どのように私はjQueryの中にキー入力間の行動を遅らせることができます。 例えば、

私はこのようなものを持っている。

 if($(this).val().length > 1){
   $.post("stuff.php", {nStr: "" + $(this).val() + ""}, function(data){
    if(data.length > 0) {
      $('#suggestions').show();
      $('#autoSuggestionsList').html(data);
    }else{
      $('#suggestions').hide();
    }
 });
}

私は、ユーザーが継続的に入力した場合にデータを掲示ないようにしたいです。だから、どのように私は、0.5秒の遅延を与えることができますか?

役に立ちましたか?

解決

これを行うには、jQueryのデータ能力を使用することができ、このような何かます:

$('#mySearch').keyup(function() {
  clearTimeout($.data(this, 'timer'));
  var wait = setTimeout(search, 500);
  $(this).data('timer', wait);
});

function search() {
  $.post("stuff.php", {nStr: "" + $('#mySearch').val() + ""}, function(data){
    if(data.length > 0) {
      $('#suggestions').show();
      $('#autoSuggestionsList').html(data);
    }else{
      $('#suggestions').hide();
    }
  });
}

ここでの主な利点は、すべての場所の上に何もグローバル変数ではありません、そしてあなただけのできるだけきれいに例をしようと、あなたが望んだ場合のsetTimeoutで匿名関数でこれをラップすることができます。

他のヒント

あなたがする必要があるのは、ユーザーがキーを押した場合にリセットされますタイムアウトであなたの関数をラップでます:

var ref;
var myfunc = function(){
   ref = null;
   //your code goes here
};
var wrapper = function(){
    window.clearTimeout(ref);
    ref = window.setTimeout(myfunc, 500);
}

次に、単にあなたのキーイベントで「ラッパー」を起動します。

これを処理するために素敵なプラグインがあります。 jQueryのスロットル/デバウンスする

ニックの答えは完璧ですが、すぐに最初のイベントを処理することは重要であるならば、私たちが行うことができると思います:

$(selector).keyup(function(e){ //or another event

    if($(this).val().length > 1){
        if !($.data(this, 'bouncing-locked')) {

            $.data(this, 'bouncing-locked', true)

            $.post("stuff.php", {nStr: "" + $(this).val() + ""}, function(data){
                if(data.length > 0) {
                    $('#suggestions').show();
                    $('#autoSuggestionsList').html(data);
                }else{
                    $('#suggestions').hide();
                }
           });

            self = this
            setTimeout(function() {
                $.data(self, 'bouncing-locked', false);

                //in case the last event matters, be sure not to miss it
                $(this).trigger("keyup"); // call again the source event
            }, 500)
        }
    }
});

私のようなので、関数内でそれをラップと思います:

  var needsDelay = false;

  function getSuggestions(var search)
  {
    if(!needsDelay)
    {
        needsDelay = true;
        setTimeout("needsDelay = false", 500);

        if($(this).val().length > 1){
            $.post("stuff.php", {nStr: "" + search + ""}, function(data){
                if(data.length > 0) {
                    $('#suggestions').show();
                    $('#autoSuggestionsList').html(data);
                }else{
                    $('#suggestions').hide();
                }
            });
        }
    }


  }

その方法に関係なく、あなたがこれをpingする回数は、以上の500ミリ秒ごとに検索することはありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top