【发布时间】:2012-12-12 02:33:12
【问题描述】:
我想在我停止在输入文本框中输入(而不是在输入时)字符后触发一个事件。
我试过了:
$('input#username').keypress(function() {
var _this = $(this); // copy of this object for further usage
setTimeout(function() {
$.post('/ajax/fetch', {
type: 'username',
value: _this.val()
}, function(data) {
if(!data.success) {
// continue working
} else {
// throw an error
}
}, 'json');
}, 3000);
});
但是这个例子会为每个输入的字符产生一个超时,如果我输入 20 个字符,我会收到大约 20 个 AJAX 请求。
On this fiddle 我用一个简单的警报而不是 AJAX 来演示同样的问题。
是否有解决方案,或者我只是为此使用了不好的方法?
【问题讨论】:
-
恐怕javascript没有提供一个事件,当用户停止输入输入字段时,您可以收到通知。为什么需要它?
-
从例子中不是很明显吗?我想触发一个事件“当最终用户停止输入时”,而不是发送 20 个请求
-
除非用户手动提交或更改字段,否则无法判断用户何时真正完成输入。您如何知道用户是否在句子中间暂停并等待 5 分钟再输入更多内容?一种可能的解决方案是使用 .blur() 并在用户焦点离开该字段时发送。
-
上面的cmets都傻了。这是一个常见的用例:当用户完成调整窗口大小、缩放地图、拖动、打字时,我想要一个事件……基本上,用户的任何连续动作都需要转化为我们的数字世界。即使是单次击键也会遇到这个问题:当你敲击一个键时,它实际上会“弹跳”,不仅会创建 1 个击键事件,而且会创建很多。您计算机的硬件或操作系统会删除这些额外事件,这就是为什么我们会产生离散击键事件的错觉。这被称为“去抖动”,这就是 OP 所需要的。
-
对反应用户的警告:stackoverflow.com/a/28046731/57883
标签: jquery timeout keypress typeahead debouncing