2011-03-18 81 views
0

我已经实现了一个脚本,我发现自动查询的查询。问题是,他每次按一个键时都会调用脚本。我试图增加超时时间,但它仍然在制造麻烦。 此处的代码:jquery autosuggestion和timeout

<input type="text" onkeyup="lookup(this.value);"> 

function lookup(inputString) { 
var time = new Date().getTime(); 
var dummy_trigger = true; 
if(inputString.length == 0) { 
    $('#suggestions').fadeOut(); // Hide the suggestions box 
} else { 
function timepassed(){ 
    now = new Date().getTime() - time; 

    if(now > 3000 && dummy_trigger){ 
    alert("search"); 
    dummy_trigger = false; 
    } 
} 
setInterval(timepassed, 1000); 
} 
} 

有什么想法吗?谢谢!

+1

jQuery UI有一个自动完成...我会推荐使用那个 - http://jqueryui.com/demos/autocomplete/ – Martin 2011-03-18 12:28:59

回答

0

虽然其他人通过发送给您使用自动填充插件来回答此问题,但这并没有真正回答以下问题:“您如何使脚本无法为每个按键?”

为什么这很重要? 零延迟对本地数据有意义(响应更快),但可能会产生大量的远程数据负载,但响应速度较慢。如果在每次击键之后每次搜索都会触发,则用户只需搜索13个搜索词就可以搜索“菊花”这个单词,当脚本应该等待,直到用户无法弄清楚单词的其余部分如何输入以及那么请关闭搜索。

虽然大多数自动完成/自动建议脚本有超时 变量以下是如何实现自己的定时器,等待使用jQuery用户:

<input type="text" id="query" /> 

注意如何在HTML不受任何JavaScript污染。这是因为jQuery的Awesomeness不依赖嵌入在HTML中的JS来执行所需的功能。

$(document).ready(function() { 
    var timer, 
     $suggestions = $('#suggestions'), 
     $search_box = $('#query'); 

    $search_box.keyup(function() { 
     if (timer) { 
      // There is a running timer from a previous keyup 
      // Clear this timer so we don't have overlap 
      clearTimeout(timer); 
     } 

     if (this.length == 0) { 
      $suggestions.fadeOut(); 
     } else {   
      timer = setTimeout(function() { 
       search(); 
      }, 1000); 
     } 
    }); 

    function search() { 
     var query = $search_box.val(); 
     alert('searching for ' + query); 
    } 
}); 

这里发生的事情:我们的setTimeout定时器分配给一个变量,它必须与上面的keyup函数声明,每一次keyup大火检查变量。如果现有的setTimeout正在进行中,请将其清除,以便它不会触发search()函数,并创建一个新的计时器以等待指定的毫秒数(在本例中为1000)。