使用ajax和按键优化search
我有以下代码,因为我想要search数据库,因为用户正在input文本框。 下面的代码工作正常,但似乎有点低效,因为如果用户input速度非常快,我可能会做更多的search,而不是必要的。 所以如果用户input“航行”
我正在寻找“帆”,“赛丽”,“赛琳”和“帆船”
我想看看是否有办法检测按键之间的任何特定时间,所以只有search用户停止键入500毫秒或类似的东西。
有没有像这样的最佳做法?
$('#searchString').keypress(function(e) { if (e.keyCode == 13) { var url = '/Tracker/Search/' + $("#searchString").val(); $.get(url, function(data) { $('div#results').html(data); $('#results').show(); }); } else { var existingString = $("#searchString").val(); if (existingString.length > 2) { var url = '/Tracker/Search/' + existingString; $.get(url, function(data) { $('div#results').html(data); $('#results').show(); }); } }
你可以做这样的事情:
$('#searchString').keyup(function(e) { clearTimeout($.data(this, 'timer')); if (e.keyCode == 13) search(true); else $(this).data('timer', setTimeout(search, 500)); }); function search(force) { var existingString = $("#searchString").val(); if (!force && existingString.length < 3) return; //wasn't enter, not > 2 char $.get('/Tracker/Search/' + existingString, function(data) { $('div#results').html(data); $('#results').show(); }); }
这样做是通过在#searchString
元素的.data()
集合上存储一个定时器,在500ms
之后执行search(在keyup
,比keypress
更好.data()
。 每一个keyup
清除该计时器,如果键被input,立即进行search,如果没有设置自动search前的另一个500ms
超时。
看到这个老问题:
在执行search之前,如何让我的实时jQuerysearch等待一秒?
我会做的是每个按键使用setTimeout函数与所需的延迟。 所以那个函数会在超时后触发。 每按一下键,然后删除定时器,并设置一个新的clearTimeout();
查看这里的一些例子,滚动浏览所有的广告。
http://www.elated.com/articles/javascript-timers-with-settimeout-and-setinterval/