我的控制器中有一个方法,我用ajax调用。 可以经常调用该方法(取决于用户键入的速度)。 用户键入字母,单词。我希望在用户停止输入后调用该方法。
方法的参数是用户的书面文字。
按照我的方式,该方法会在很短的时间内被调用很多次。
有没有办法总是调用方法(在每个字母之后),但是如果立即调用它,那么该方法会立即停止执行?
示例:用户将缓慢写入10个字母 - 该方法将被调用10次。 示例:用户将快速写入10个字母 - 该方法将被调用第10次或该方法将被调用10次,但将停止执行前9次并仅完成第10次执行
答案 0 :(得分:3)
假设您使用AJAX调用它,那么我认为您最好放置逻辑客户端。考虑使用像throttle.js这样的东西,它只会在输入暂停后发布Ajax调用。
答案 1 :(得分: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
您需要使用聚合时间窗口来查找感觉自然的东西,但它应该相对简单。你将直接调用DoSOmethingBuffer而不是DoSomethign。
答案 2 :(得分:0)
您可以使用javascript计时器完成此操作。这是一个示例,一旦自用户的最后一次按键后半秒钟就会触发任何逻辑。 如果用户继续输入,则定时器将不断被取消:
$(function() {
var timer;
$(".typeAhead").keypress(function() {
if (timer != null)
clearTimeout(timer);
timer = setTimeout(function() {
// do ajax call
}, 500);
});
});
此代码段使用jquery,但如果没有它,则可以执行此操作。只需使用getElementById()
代替选择器。