31

如何在 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 秒呢?

4

5 回答 5

66

您可以使用 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 中的匿名函数中,只是试图使示例尽可能干净。

于 2010-03-09T17:11:54.257 回答
11

您需要做的就是将您的函数包装在一个超时中,当用户按下一个键时该超时会被重置:

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

然后只需在您的关键事件中调用“包装器”。

于 2010-03-09T17:14:13.203 回答
3

有一个很好的插件来处理这个。 jQuery 节流/去抖动

于 2010-03-09T18:38:51.393 回答
2

尼克的回答是完美的,但如果立即处理第一个事件至关重要,那么我认为我们可以这样做:

$(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)
        }
    }
});
于 2013-10-30T03:15:20.383 回答
1

我会将它包装在这样的函数中:

  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 毫秒。

于 2010-03-09T17:15:49.350 回答