2011-05-06 106 views
28

我想在用户键入文本框后执行一个类似于2秒的功能。如果他们在1秒后继续键入,则延迟时间将重置为2.jQuery值更改事件延迟

它应该功能类似于自动填充框。

我知道2个事件:changekeyup。我与change的问题在于,文本框必须放松焦点才能触发它。对于keyup,如果他们使用鼠标粘贴文本会怎么样?

我可以帮忙吗?

回答

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)的两倍,但它并没有因为事件处理程序的本质关系。

+0

应该在你的例子中event.type是evt.type?看起来不错,我想我[可以借用这个。 IE7引发了多种财产变更,甚至是onblur。这是否抓住他们,只处理一次?计时器的目的是什么? – armyofda12mnkeys 2012-04-26 13:54:01

+1

@ armyofda12mnkeys:nope,'event.type'是正确的,它正在寻找IE中提供的全局'event'对象。如果你想要更加谨慎,你可以把它改成'window.event。*'。它只处理'value'属性的变化,如果它触发不止一次,那么它会取消前一个设置的定时器。 – 2012-04-26 14:10:32

2

你可以把两者变化和KEYUP:

var globalTimeout; 

$(function() { 
    $("#myInput").change(initTimer).keyup(initTimer); 
}); 

function initTimer() { 
    if (globalTimeout) clearTimeout(globalTimeout); 
    globalTimeout = setTimeout(handler, 2000); 
} 

function handler() { 
    ... 
} 
0

keyup将工作:

$("#s").keyup(function(e){ 
    $("#t").html($(this).val()); 
}); 

的jsfiddle:http://jsfiddle.net/3nx6t/

+0

'keyup'是检测用户输入的不佳事件。只有当用户将他的手指从钥匙上抬起并且仅仅是键盘输入(没有粘贴,拖放/拼写检查更正等)时才会触发。 – 2011-05-06 21:52:07

+0

@安迪:请参阅演示。 jQuery 1.6也支持粘贴! – 2011-05-06 21:53:00

+0

右键点击并选择粘贴,不会触发 – 2011-05-06 21:58:16

0

我会做这样的:

$("selector").keyup(function(){ 
    if(typeof(window.delayer) != 'undefined') 
     clearTimeout(window.delayer); 
    window.delayer = setTimeout(function_you_want_to_get_execute_with_delay, 2000); 
}); 

干杯

12

您可以绑定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

'propertychange'是'keyup'上的一个更好的选择。它受Internet Explorer支持,只要用户执行某些操作来改变输入字段的'value'属性,就会触发它,就像输入一样好。看到我上面的答案。 – 2011-05-07 14:21:03

+0

是'keyup'工作还构成'select'输入吗? – GusDeCooL 2012-04-22 15:23:38

+0

为了这个目的,'select'具有'change' – pebbo 2015-09-09 15:26:20