2010-04-27 162 views
9

我很難在javascript/jQuery中捕獲退格鍵作爲鍵盤事件。在Firefox,Safari,Opera或Chrome瀏覽器,並在iPhone/iPad的,我捕捉到這樣一個文本輸入框keyup事件:捕獲backspace的鍵盤事件

$(id_input).keyup(function(event) { 
    that.GetHints($(this).val().trim(), event, fieldName); 
}); 

此事件捕獲用戶的擊鍵,然後將它們發送給一個函數發出ajax查詢調用。

我的問題出現在用戶希望退回他/她已輸入的字符時。在除了我的Droid手機以外的所有瀏覽器中,當我按下退格鍵時,此鍵盤事件捕獲由$(this).val()。trim()返回的值並將其發送到函數中進行處理GetHints。然而,在Droid上,這個keyup和相等的keydown事件都不會觸發,直到用戶退出$(this)中的每個字符爲止。例如,如果我輸入「cu」,然後退回到「u」,在輸入字段中只留下「c」,除Droid之外的所有瀏覽器中,關鍵事件將觸發並調用功能GetHints("c", event, fieldName)。在Droid上,keyup事件從不會觸發。

我錯過了什麼?在我的Droid上,軟鍵盤或硬鍵盤上的退格鍵如何/爲什麼沒有按預期運行?我如何解決這個問題?

+0

只是在黑暗中拍攝,因爲它聽起來像一個機器人問題:你嘗試過keydown或按鍵事件嗎?也許你會有更多的運氣。 – Jon 2011-06-03 03:43:48

+0

是的,我會嘗試按鍵而不是鍵盤 – jnoreiga 2011-06-03 12:17:23

回答

2

您可以輪詢文本中的更改(使用setInterval)。這可能會更可靠。例如,如果用戶確實右鍵單擊 - >剪切,則鍵盤不會觸發。僅靠民意測驗的響應速度會較慢,但您可以將其與鍵控相結合以保持活潑。輪詢將會有更多的處理器。

試試沿着這些線路:

var oldText = ''; 
var timer = setInterval(function(){ 
    var text = $(id_input).val().trim(); 
    if(text != oldText){ 
     oldText = text; 
     that.GetHints(text, fieldName); 
    } 
}, 500); 

的間隔時間根據需要扭捏。

我不知道什麼that.GetHintsevent做什麼,但很明顯,你不能通過使用輪詢方法(因爲沒有實際的事件被觸發)。這是一個問題嗎?

如果需要,您可以使用clearInterval(timer);停止輪詢。

您可以保持現有的按鍵功能(增加響應性)。或者,您可能希望進行輪詢以避免that.GetHints被調用太多(例如,如果某人真的很快鍵入了某個內容)。