Javascript 如何在用户打字时延迟按键功能,以避免';每次击键都不会发出请求吗?

Javascript 如何在用户打字时延迟按键功能,以避免';每次击键都不会发出请求吗?,javascript,jquery,ajax,Javascript,Jquery,Ajax,背景 我在一个页面上有许多下拉列表。如果更改第一个下拉列表,其余下拉列表将根据所选内容进行更新 在我们的例子中,我们处理基金数据。因此,第一个下拉列表是“所有基金类型”。您选择“对冲基金”,下一个下拉列表将通过仅适用于对冲基金的选项进行过滤 客户现在要求我在混合中加入一个文本字段,当用户开始键入时,它将影响这些结果 因此,如果他们键入“USD”,第二个下拉列表将只包含名称中带有“USD”的基金的期权 问题 我遇到的具体问题是,我使用的代码: $('#Search').keypress(funct

背景

我在一个页面上有许多下拉列表。如果更改第一个下拉列表,其余下拉列表将根据所选内容进行更新

在我们的例子中,我们处理基金数据。因此,第一个下拉列表是“所有基金类型”。您选择“对冲基金”,下一个下拉列表将通过仅适用于对冲基金的选项进行过滤

客户现在要求我在混合中加入一个文本字段,当用户开始键入时,它将影响这些结果

因此,如果他们键入“USD”,第二个下拉列表将只包含名称中带有“USD”的基金的期权

问题

我遇到的具体问题是,我使用的代码:

$('#Search').keypress(function () {
    // trigger the updating process
});
它会触发对每个按键的搜索。因此,当我输入“USD”时,我立即收到3个请求——一个是“U”,一个是“US”,一个是“USD”

我已尝试使用以下设置超时:

$('#Search').keypress(function () { 
    // I figure 2 seconds is enough to type something meaningful
    setTimeout(getFilteredResultCount(), 2000);
});
但所有这些都需要等待2秒钟才能完成我所描述的


我相信这个问题以前已经解决了。有人能建议如何解决这个问题吗

我以前这样做的方法是设置超时,但每次按下新键时都会清除现有超时。这样,您应该只在用户停止键入时收到发送的请求


(我会暂停500毫秒左右。)

+1感谢你在这方面击败了我。我正要建议OP在新事件上清除他的
setTimeout
。。我仍在提交3份美国科学与发展部的申请。我会仔细看看,看看我是否能做些什么。如果你每次按键间隔超过500毫秒,你会收到3份申请。但是你知道,对吧?@Dave:这里的问题是
setTimeout(getFilteredResultCount(),500)立即执行该函数。不传递字符串,只传递函数本身:
setTimeout(getFilteredResultCount,500)
(没有
()
)(我知道我上面说过同样的话,但我也想@Tim知道)。仅供参考,如果需要传递参数,可以将函数调用包装到另一个函数中,如下所示:
setTimeout(function(){getFilteredResultCount(someParameterOfMine)},500)
是否确实要将
getFilteredResultCount
的返回值传递给
setTimeout
而不是函数本身?所需的是事件去抖动。这看起来很有趣,但在星期五的这个时候&这么多的文字-要等到星期一!!:-)关于
getFilteredResultCount
的返回值,有一点很好。幸运的是,我不需要它来返回任何东西,但是记住它很好,所以您可能需要
setTimeout(getFilteredResultCount,2000)。如果添加括号,则立即调用该函数。
var timeoutId = 0;
$('#Search').keypress(function () { 
    clearTimeout(timeoutId); // doesn't matter if it's 0
    timeoutId = setTimeout(getFilteredResultCount, 500);
    // Note: when passing a function to setTimeout, just pass the function name.
    // If you call the function, like: getFilteredResultCount(), it will execute immediately.
});