2011-05-06 166 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