清除ajax查询的超时

时间:2013-12-30 07:48:16

标签: jquery ajax settimeout cleartimeout

我正在使用AJAX构建一个下拉菜单,我希望在实际提交之前将用户查询延迟3秒。

所以我尝试过这样的事情:

$("#search").keyup(function(){
    clearTimeout(startcounting);
    var startcounting = setTimeout(function() {
            $.get( "mailing_search.php", { query: $("#searchitem").val() } ).done(function( data ) {
                console.log("Query Submitted");
                $("#searchbox").html(data);
            });     
        },3000);
    }
});

这不起作用。它不会清除超时。
假设我输入“samsung”它运行查询7次。

任何帮助?
提前谢谢。

3 个答案:

答案 0 :(得分:0)

我认为问题出在变量范围内。您必须在功能之外声明startcounting

var startcounting;
$("#search").keyup(function(){
    clearTimeout(startcounting);
    startcounting = setTimeout(function() {
        $.get( "mailing_search.php", { query: $("#searchitem").val() } ).done(function( data ) {
            console.log("Query Submitted");
            $("#searchbox").html(data);
        });     
    },3000);
}

});

答案 1 :(得分:0)

正确的做法:http://jsbin.com/eqUvAYe/5/edit

您正在寻找功能去抖动。

function debounce(el)
{
    var exec;

  $(el).keyup(
  function ( )
    {
        if (exec)
        {
            clearTimeout(exec);
        }
        exec = setTimeout(function ()
        {
           console.log('1');     // put your ajax call here
        }, 3000);
    });

}

debounce($("#search"));

或(没有包装函数)

$("#search").keyup(
    function ()
    {
        var startcounting;
        return function ()
        {
            if (startcounting) clearTimeout(startcounting);
              startcounting = setTimeout(function ()
            {
                console.log('1') //put your ajax here.
            }, 3000);
        }
    }()
);

在阅读(再次)您的问题之后,这就是您所需要的。无需放置全局变量。

仅供参考:

这种操作有两种方式:

1)油门功能

2)功能debounc。

阅读完本书后:Third party javascript

有一节关于:

  

控制昂贵的电话:节流和去抖解决方案   这个问题在于两种技术,旨在控制你的频率   函数被调用。这些技巧 - 节流和去抖 - 工作   创建一个包装函数,限制对原始的调用   功能

enter image description here

答案 2 :(得分:-2)

尝试以下方法。在keyup之外声明计时器功能。

startcounting = setTimeout(function() {
        $.get( "mailing_search.php", { query: $("#searchitem").val() } ).done(function( data ) {
            console.log("Query Submitted");
            $("#searchbox").html(data);
        });     
    },3000);
$("#search").keyup(function(){
    clearTimeout(startcounting);

}