等待功能直到用户停止输入

时间:2012-04-12 13:01:54

标签: jquery events delay settimeout

我让用户在打字时进行ajax调用。问题是它会调用每个字母的输入,所以我设置了这样的超时:

$(input).live('keyup', function(e){

setTimeout(function(){ 

var xx = $(input).val();
doSearch(xx); 

}, 400); 

}); 

确实等待了400ms,然后为每个keyup执行。如何在最后输入的字母后约400ms时更改此选项以使ajax调用“一次”?

(我过去使用过'延迟',但这对我的脚本根本不起作用......)

4 个答案:

答案 0 :(得分:19)

timer = 0;
function mySearch (){ 
    var xx = $(input).val();
    doSearch(xx); 
}
$(input).live('keyup', function(e){
    if (timer) {
        clearTimeout(timer);
    }
    timer = setTimeout(mySearch, 400); 
});

最好将你的函数移动到一个命名函数并多次调用它,因为否则你会在每个keyup上创建另一个lambda函数,这是不必要且相对昂贵的

答案 1 :(得分:4)

每次按下新键时都需要重置计时器,例如

(function() {
    var timer = null;

    $(input).live('keyup', function(e) {
        timer = setTimeout(..., 400);
    });

    $(input).live('keydown', function(e) {
        clearTimeout(timer);
    });
)();

函数表达式用于确保timer变量的范围仅限于需要它的那两个函数。

答案 2 :(得分:0)

我认为只要你是o.k,你就可以再次使用delay()。添加一个新的临时“东西”混合。这对你有用吗?

$(input).live('keyup', function(e) {
    if (!$(input).hasClass("outRunningAJob")) {
        var xx = $(input).val();
        $(input).addClass("outRunningAJob");
        doSearch(xx);
        $(input).delay(400).queue(function() {
            $(this).removeClass("outRunningAJob");
            $(this).dequeue();
        });
    }
});

答案 3 :(得分:0)

我发现以下内容更容易实现:

$(input).on('keyup', function () {
    delay(function () {
        if (input).val() !== '' && $(input).val() !== $(input).attr('searchString')) {
            // make the AJAX call at this time
            // Store the value sent so we can compare when JSON returns
            $(input).attr('searchString', $(input).val());

            namepicker2_Search_Prep(input);
        }
    }, 500);
});

通过存储当前字符串,您可以看到用户已停止输入。然后,您可以安全地调用您的函数来执行处理需要发生的事情。