jQuery:如何为ajax请求添加延迟?

时间:2010-07-28 23:49:34

标签: jquery ajax

我有一个函数,它在回显时返回AJAX中触发的某些数据量。

但是,只要输入“hello my name is”之类的“long”字符串,每次键入一个键时都会启动一个请求(一次请求10次,获得1个请求响应需要5秒)

如何避免这种情况? (我不想使用.onblur)

$(document).ready(function()
    {
      $('.search input[type="submit"]').hide();

      $('#search_keywords').keyup(function(key)
      {
        if (this.value.length >= 2 || this.value == '')
        {
          $('#loader').show();
          $('#jobs').load(
            $(this).parents('form').attr('action'),
            { query: this.value + '*' },
            function() { $('#loader').hide(); }
          );
        }
      });
    });

谢谢;)

1 个答案:

答案 0 :(得分:5)

我倾向于在keyup事件上设置一个计时器,如下所示:

$('#search_keywords').keyup(function() {
  clearTimeout($.data(this, 'timer'));
  $(this).data('timer', setTimeout($.proxy(search, this), 500));
});
function search()  {
  if (this.value.length >= 2 || this.value == '') {
    $('#loader').show();
    $('#jobs').load(
      $(this).parents('form').attr('action'),
      { query: this.value + '*' },
      function() { $('#loader').hide(); }
    );
  }
}

这会将您的搜索分解为另一个功能,我们只是在敲击一个键并触发该搜索功能之间延迟500毫秒。如果您键入另一个字母,500ms计时器将使用clearInterval()重置,因此快速键入不会触发20个事件,只有在您暂停半秒后它才会触发。 this部分是setTimeout()在{{1}}执行时正确的。