2011-08-06 29 views
1

我想掐死我写了下面的AJAX实时搜索功能。节流一个Ajax实况搜索功能

我说得那么,如果是进入了一个最小的2个字符的请求后,才会发送。我也想扼杀ajax四分之一秒,让用户有机会输入他们想要的东西。我将ajax包装在setTimeout函数中,但这不起作用。

 $('#search').keyup(function() { 
      var string = $(this).val(); 
      if (string.length >= 2) { 
       $.ajax({ 
        'type': 'GET', 
        dataType: 'html', 
        'url': url, 
        'success': function(data){ 
            // show the search data 
        } 
       });            
      } else if (string.length <= 1) { 
         // restore page content as of when it was loaded 
      } 
     }); 

我应该问的另一件事,我应该缓存ajax的结果,不是吗?

+0

我看到你的代码中没有'setTimeout'。 –

+0

我把它拿出来,因为它导致了一个错误。 – Mohamad

+0

这是我们很难告诉你_why_这是造成一个错误,如果我们不能看到你做了什么。 –

回答

1

只需将代码:

var elem = $(this); 
// save newest search 
elem.data('search',search) 
// clear pending searches 
.clearQueue().stop() 
// waits 
.delay(250) 
// runs search 
.queue(function() { 
    $.ajax({ 
     'type': 'GET', 
     dataType: 'html', 
     'url': url, 
     'success': function(data){ 

     // check if can be run 
     if(elem.data('search') != search) 
      return; 

       // show the search data 
     } 
    }); 
}); 
+0

谢谢。这是一个开始。它似乎适用于第一次请求,但后来的似乎并没有影响。例如,如果我输入duty'的'呼叫真快,我结束了三个请求时的延迟时间在1000 ...没办法我花时间比击键之间的第二。 – Mohamad

+1

我忘了添加停止(),那应该修复时间问题 –

+0

我已经添加处理后续ajax调用 –

1

查看(或考虑使用)的源代码Jquery Autocomplete它几乎完全符合您的要求,它只在暂停后提交数据以确保用户已完成,并且其中包含缓存特征。里面if (string.length >= 2)

+0

既然你已经在使用jQuery,我会用这个。否则,你需要使用setTimeout和clearTimeout以确保您取消setTimeout如果用户仍输入数据(否则的setTimeout将始终运行)。 – Kris