2011-08-06 67 views
5

我用下面的代碼(written by another user)扼殺在實況搜索功能Ajax請求:如果你喜歡一個演示途徑AJAX限制請求

的jsfiddle:http://jsfiddle.net/4xLVp/

看來馬車,雖然。使用Ctrl+shift+back-arrow清除值,然後再次輸入會導致一系列請求。空白值也會導致請求。它看起來似乎不錯,特別是與jQuery UI autocomplete相比,請求延遲似乎更多地被測量。

$('##tag-search').keyup(function() { 
     var elem = $(this); 
     if (elem.val().length >= 2) { 
      elem.data('search',search).clearQueue().stop().delay(1000).queue(function() { 
       $.ajax({ // ajax stuff 
        'success': function(data){ /*show result*/ } 
       }); 
       if (elem.data('search') != string) return; 
      });            
     } else if (string.length <= 1) { /*show original content*/ } 
    }); 

有沒有更好的方法來處理這個問題?

回答

8

我只想用setTimeout

(function() { 
    var timeout; 
    $('#tag-search').keyup(function() { 
     var elem = $(this); 
     if (elem.val().length >= 2) { 
      clearTimeout(timeout); 
      timeout = setTimeout(function() { 
       $.ajax({ // ajax stuff 
        'success': function(data){ /*show result*/ } 
       });  
      }, 80); // <-- choose some sensible value here          
     } else if (string.length <= 1) { /*show original content*/ } 
    }); 
}()); 

還有一個debounce/throttle插件。

+0

謝謝。這就是訣竅,我很驚訝這很簡單。你能解釋一下clearTimeout()做什麼以及爲什麼需要它? – Mohamad

+0

setTimeout - 設置一段時間後將執行的代碼,clearTimeout - 刪除該待執行的代碼,在啓動新代碼之前需要清除更早的請求ajax請求 –

+0

順便說一句 - 我不建議刪除if(elem.data('搜索')!=字符串)返回;'部分,它可以防止更早的Ajax調用(持續更長時間)更新已經改變的結果 –