我想在用户键入文本框后执行一个类似于2秒的功能。如果他们在1秒后继续键入,则延迟时间将重置为2.jQuery值更改事件延迟
它应该功能类似于自动填充框。
我知道2个事件:change
和keyup
。我与change
的问题在于,文本框必须放松焦点才能触发它。对于keyup
,如果他们使用鼠标粘贴文本会怎么样?
我可以帮忙吗?
我想在用户键入文本框后执行一个类似于2秒的功能。如果他们在1秒后继续键入,则延迟时间将重置为2.jQuery值更改事件延迟
它应该功能类似于自动填充框。
我知道2个事件:change
和keyup
。我与change
的问题在于,文本框必须放松焦点才能触发它。对于keyup
,如果他们使用鼠标粘贴文本会怎么样?
我可以帮忙吗?
还有的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
)的两倍,但它并没有因为事件处理程序的本质关系。
你可以把两者变化和KEYUP:
var globalTimeout;
$(function() {
$("#myInput").change(initTimer).keyup(initTimer);
});
function initTimer() {
if (globalTimeout) clearTimeout(globalTimeout);
globalTimeout = setTimeout(handler, 2000);
}
function handler() {
...
}
keyup
将工作:
$("#s").keyup(function(e){
$("#t").html($(this).val());
});
的jsfiddle:http://jsfiddle.net/3nx6t/
'keyup'是检测用户输入的不佳事件。只有当用户将他的手指从钥匙上抬起并且仅仅是键盘输入(没有粘贴,拖放/拼写检查更正等)时才会触发。 – 2011-05-06 21:52:07
@安迪:请参阅演示。 jQuery 1.6也支持粘贴! – 2011-05-06 21:53:00
右键点击并选择粘贴,不会触发 – 2011-05-06 21:58:16
我会做这样的:
$("selector").keyup(function(){
if(typeof(window.delayer) != 'undefined')
clearTimeout(window.delayer);
window.delayer = setTimeout(function_you_want_to_get_execute_with_delay, 2000);
});
干杯
您可以绑定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));
});
应该在你的例子中event.type是evt.type?看起来不错,我想我[可以借用这个。 IE7引发了多种财产变更,甚至是onblur。这是否抓住他们,只处理一次?计时器的目的是什么? – armyofda12mnkeys 2012-04-26 13:54:01
@ armyofda12mnkeys:nope,'event.type'是正确的,它正在寻找IE中提供的全局'event'对象。如果你想要更加谨慎,你可以把它改成'window.event。*'。它只处理'value'属性的变化,如果它触发不止一次,那么它会取消前一个设置的定时器。 – 2012-04-26 14:10:32