在多次keydown事件后一秒钟执行AJAX搜索

所以我用jquery做了一个自动完成 。 Ajax用于从远程位置获取繁重的xml文件 。 如果我搜索前。 “两个半人” 用ajax 做了大约16个查询 (对于除了3个之外的每个字母,查看代码)。

我希望它在用户按下最后一个键后一秒钟执行Ajax请求,这样它将执行一个查询而不是16个查询。

因此,如果用户在上次keydown事件后的1秒钟之前按下另一个键,它将不会执行查询。

 $(document).ready(function(){ $('#tv_search').keydown(function(){ var search = $(this).val(); if(search.length >= 3) { $.ajax({ type: "GET", url: "search.php", data: {show : search, key : '890k4900k0ll' } }).done(function(msg){ $('#t').html(msg); }); } }); });  Search for series:  

有任何想法吗?

您可以使用超时,并在每次按下键时清除它:

 $(document).ready(function() { $('#tv_search').on('keyup', function() { clearTimeout($(this).data('timer')); var search = this.value; if (search.length >= 3) { $(this).data('timer', setTimeout(function() { $.ajax({ type: "GET", url: "search.php", data: { show: search, key: '890k4900k0ll' } }).done(function(msg) { $('#t').html(msg); }); }, 1000)); } }); });​ 

为避免在每次按键时生成多个AJAX请求,请尝试以取消上次超时的方式使用setTimeout()clearTimeout()方法,并在清除之后通过调用setTimeout()启动新的超时。 setTimeout()方法应包含AJAX请求,该请求在四分之一秒(250毫秒)用户按下一个键后执行。

如果请求可用,我也会abort()

 var timeOut = null, myXHR = null; $(document).ready(function(){ $('#tv_search').keydown(function(){ // It will clear the setTimeOut activity if valid. if(timeOut) clearTimeout(timeOut); var search = $(this).val(); if(search.length >= 3) { timeOut = setTimeout(function(){ // Cancel the last request if valid if(myXHR) myXHR.abort(); myXHR = $.ajax({ type: "GET", url: "search.php", data: {show : search, key : '890k4900k0ll' } }).done(function(msg){ $('#t').html(msg); }); }, 250);// wait for quarter second. } }); }); 

我有一个解决方案,允许你延迟你调用的任何方法,避免重复调用,根本不使用!

https://stackoverflow.com/a/30503848/1834212

退出简单的解决方案:

  

' mytimer '必须是全局变量,只需在每个事件调用中清除之前的' mytimer '。 它只会在1秒的间隔内执行最新的呼叫。