我希望在用户完成文本框输入后执行类似2秒的功能。如果它们在1秒后继续输入,延迟时间将重置为2。
它应该起到类似于自动完成框的作用。
我知道有两件事:change
和keyup
。我对change
的问题是文本框必须放松焦点才能触发它。对于keyup
,如果他们使用鼠标粘贴文本会怎么样?
我可以在这里得到帮助吗?
答案 0 :(得分:27)
所有当前主流浏览器都支持HTML5 oninput
事件,可以使用IE 8及更低版本:
$("#myInput").bind("input", function () {
// ...
})
一种非常简单的跨浏览器方法
$("#myInput").bind("input propertychange", function (evt) {
// If it's the propertychange event, make sure it's the value that changed.
if (window.event && event.type == "propertychange" && event.propertyName != "value")
return;
// Clear any previously set timer before setting a fresh one
window.clearTimeout($(this).data("timeout"));
$(this).data("timeout", setTimeout(function () {
// Do your thing here
}, 2000));
});
这将使事件在IE 9中触发两次(一个用于propertychange
,一个用于input
),但由于事件处理程序的性质而无关紧要。
答案 1 :(得分:13)
您可以绑定input
事件以及keyup
以便在旧版浏览器上进行后备。然后,您可以启动计时器,每次检测到用户操作时,计时器都会重置。通过在当前元素的数据中保存计时器句柄,可以确保多个元素不会相互干扰。
$('input').bind('input keyup', function(){
var $this = $(this);
var delay = 2000; // 2 seconds delay after last input
clearTimeout($this.data('timer'));
$this.data('timer', setTimeout(function(){
$this.removeData('timer');
// Do your stuff after 2 seconds of last user input
}, delay));
});
答案 2 :(得分:2)
您可以同时进行更改和加密:
var globalTimeout;
$(function() {
$("#myInput").change(initTimer).keyup(initTimer);
});
function initTimer() {
if (globalTimeout) clearTimeout(globalTimeout);
globalTimeout = setTimeout(handler, 2000);
}
function handler() {
...
}
答案 3 :(得分:0)
keyup
将有效:
$("#s").keyup(function(e){
$("#t").html($(this).val());
});
Jsfiddle:http://jsfiddle.net/3nx6t/
答案 4 :(得分:0)
我会这样做:
$("selector").keyup(function(){
if(typeof(window.delayer) != 'undefined')
clearTimeout(window.delayer);
window.delayer = setTimeout(function_you_want_to_get_execute_with_delay, 2000);
});
干杯