1

我的控制器中有一个方法,我用 ajax 调用它。该方法可以非常频繁地调用(取决于用户的打字速度)。用户键入字母、单词。我希望在用户停止输入后调用该方法。

该方法的参数是用户编写的文本。

以我的方式,该方法在很短的时间内被调用了很多次。

有没有办法总是(在每个字母之后)调用该方法,但是如果立即调用该方法则立即停止执行?

示例:用户将慢慢写 10 个字母 - 该方法将被调用 10 次。示例:用户将快速写 10 个字母 - 该方法将被第 10 次调用或该方法将被调用 10 次但将停止执行前 9 次并仅执行第 10 次

4

3 回答 3

3

假设您使用 AJAX 调用它,那么我认为您最好将逻辑客户端放置。考虑使用像throttle.js这样的东西,它只在输入暂停后发布 Ajax 调用。

于 2012-07-18T15:43:25.147 回答
0

您可以通过缓冲结果并将它们传递给此方法来完成此操作。基本上,通过将此方法包装在聚合器方法中,您可以防止它一直触发。

//... Class Impl

private string keys = String.Empty;
private readonly TimeSpan bufferDelay = new TimeSpan(100000);
private DateTime lastKeyPress = DateTime.UtcNow;

private void DoSomething(string text)
{
//do something to process text.
    keys = String.Empty;

}


public void DoSomethingBuffer(string text)
{
    keys =+ text;
    var now = DateTime.UtcNow;
    if((now-lastKeyPress) > bufferDelay)
{
    DoSomething(keys);
}
    lastKeyPress = now;

}
//... More Class Impl

您需要使用聚合时间窗口来找到感觉自然的东西,但它应该相对简单。您将直接调用 DoSOthingBuffer 而不是 DoSomethign。

于 2012-07-18T15:51:52.670 回答
0

您可以使用 javascript 计时器来完成此操作。这是一个示例,它会在用户最后一次按键后半秒后触发任何逻辑。如果用户继续输入,则计时器会不断被取消:

$(function() {
    var timer;
    $(".typeAhead").keypress(function() {
        if (timer != null)
            clearTimeout(timer);
        timer = setTimeout(function() {
            // do ajax call
        }, 500);
    });
});

此代码段使用 jquery,但您可以不使用它。只需使用getElementById()而不是选择器。

于 2012-07-18T16:30:12.083 回答