使用Ajax和keypress优化搜索

时间:2010-06-12 12:50:44

标签: jquery ajax search keypress

我有以下代码,当用户在文本框中输入时,我想用它来搜索数据库。下面的代码工作正常,但似乎有点低效,就好像用户打字速度非常快。我可能会进行比必要更多的搜索。因此,如果用户输入“航行”,我正在搜索“帆”,“赛丽”,“赛林”和“帆船”。

我想知道是否有办法检测按键之间的任何特定时间,因此只搜索用户是否停止输入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();
            });
        }
    }

4 个答案:

答案 0 :(得分:85)

您可以这样做:

$('#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();
    });
}

这样做是通过在keyup元素的{{3}上存储计时器,在keypress之后执行搜索(在500ms上,对于这些情况优于#searchString) }}。每个keyup清除该计时器,如果该密钥已输入,则立即搜索,如果在自动搜索之前没有设置另一个500ms超时。

答案 1 :(得分:3)

答案 2 :(得分:1)

我要做的是每次按键都使用具有所需延迟的setTimeout函数。因此该函数将在超时后触发。然后按下每个键,删除定时器并使用clearTimeout();

设置一个新定时器

点击此处查看一些示例,滚动浏览所有广告。

http://www.elated.com/articles/javascript-timers-with-settimeout-and-setinterval/

答案 3 :(得分:0)

我只想添加更多问题。 节流和防抖动概念与此主题相关。

限制: 它将使您以指定的时间间隔执行该功能。

去抖: 当用户停止键入时,它将使您执行该功能。

您可以通过setimeout和cleartimeout函数实现这两个目标。选中此链接将为您提供清晰的演练。

LINK