2011-09-28 41 views
3

我正在寫一個修正部件到一個文本區圖書館,所以我需要在用戶開始輸入的東西來檢測:獲取.VAL()*不* KEYUP

this.$input.bind('keydown keyup', function() { 
    if (this.$input.val() == …) { … } 
} 

.val()只有在觸發keyup時纔會更新。這太拖延了。我想知道​​上的輸入框的狀態。你知道一個改善.val()的圖書館嗎?

回答

5

太遲了?無法想象10ms會產生很大差異的場景,但您可以始終檢查事件參數並從那裏獲取字符。或嘗試keypress

編輯:還有input event只要輸入發生變化(在鍵值之前,但值改變之後)就會被觸發;

+0

由於輸入框的文本會立即對鍵盤輸入作出反應,因此我的小部件的延遲響應確實非常突出。 –

+0

@MthetheRobertson:查看更新。 – mpen

+2

哇,看起來完美無瑕。你贏得一切。 –

3

以確定在​​/keypress字符的唯一方法是通過使用event.keyCodeevent.which屬性(其中event是一個對象,作爲第一個參數事件監聽器函數傳遞)。

交換keypress事件的事件。該按鍵被按下時,該事件監聽器被觸發。​​和keyup只發射一次。在​​/keyup事件中,可能已添加多個字符。

1

對於按鍵(例如「a」鍵),將「a」附加到文本輸入之前觸發​​事件。您可以檢測事件類型,以及.keyCode(或.which)事件屬性是否是可打印範圍內的鍵,並嘗試預測keyup事件後可能返回的內容,但這是個壞主意

this.$input.bind('keydown keyup', function(e) { 
    var val = this.$input.val(); 

    if (e.type == 'keydown') { 
     // Here is where you would check to see if e.keyCode was a printable 
     // character. Note that key codes differ from ASCII codes. For 
     // example, the "a" key will return key code 65, which is actually 
     // the ASCII code for "A", so you would need to check for the presence 
     // of shift keys and such. Again, this is a bad idea :) 
     val += String.fromCharCode(e.keyCode); 
    } 

    if (val == …) { … } 
} 
+1

爲什麼這是一個壞主意? –

+2

@Matthew:因爲它將一個方形釘子推入圓孔。按照定義,'keydown'事件發生在按鍵上的任何事情之前。這意味着無論什麼控制鍵到文本翻譯還沒有機會運行。所以它基本上是以非常直觀和全面的方式重新實現翻譯邏輯。換句話說,你會重塑一個劣質車輪。 – FtDRbwLXw6