2013-01-10 57 views
11

我正在製作一個小文字遊戲,我需要獲取用戶在鍵盤上輸入的最後一個字符。我想到了兩種方法來做到這一點。在鍵盤事件上獲取正確的字符

第一個是通過監聽文檔鍵盤事件並通過鍵碼獲取每個字符。它工作得很好,直到我開始用鍵盤死鍵(如Â)寫字符。 String.fromCharCode(e.keyCode)將其轉換爲A,因爲keyCode用於A,但事件似乎沒有關於事件產生的死鍵或實字符的事件。

第二個問題是保持隱藏的輸入總是聚焦(壞),並且鍵盤事件獲取輸入值的最後一個字符,但是這隻有在我寫得相當慢時纔有效。我的代碼如下所示:

function is_char(e){ 
    return (!e.ctrlKey && !e.altKey && !e.metaKey && 
         (e.keyCode >= 65 && e.keyCode <= 90) || 
         (e.keyCode >= 97 && e.keyCode <= 122) 
       ); 
} 
$('#fake_input').on('keyup', function(e){ 
    if (is_char(e)){ 
    $('#result').append(this.value[this.value.length - 1]); 
    } 
}).focus(); 

這裏工作的例子 - http://jsfiddle.net/YkaBm/1/ - 你應該輸入下面的同一個詞,但是當你寫快一點事實證明是錯誤的。

你有一些建議如何獲得鍵盤事件的真實(正確)字符或爲什麼輸入鍵值事件是這樣的?

更新!

正如我在評論中提到semir.babajic答案也不太工作,我的情況,但由於森馬我發現,這種無聊的解決方案的工作原理:

function is_char(e){ 
    return (!e.ctrlKey && !e.altKey && !e.metaKey && 
         (e.keyCode >= 65 && e.keyCode <= 90) || 
         (e.keyCode >= 97 && e.keyCode <= 122) 
       ); 
} 
var x = 0; 
$('#fake_input').on('keyup', function(e){ 
    if (e.keyCode === 8){ 
    x--; 
    } 
    else if (is_char(e)){ 
    x++; 
    $('#result').append(this.value[x-1]); 
    } 
}).focus(); 

我還是很想找到一種方法使用任何$(文檔)鍵盤事件從鍵盤事件中獲取真實的字符,因爲保持輸入焦點似乎不是一個好的解決方案。

更新2!

萬一其他人是否有類似的問題,我發現這個解決方案的最佳:

App.insert_char = function(c){ 
    if (c && c.toUpperCase() != c.toLowerCase()){ 
     console.log(c); 
    } 
}; 

if ('oninput' in $('#fake_input')[0]){ 
    $('#fake_input').on('input', function(e){ 
     App.insert_char(this.value[this.value.length - 1]); 
    }); 
} 
else if ('onpropertychange' in $('#fake_input')[0]){ 
    $('#fake_input').on('propertychange', function(e){ 
     App.insert_char(this.value[this.value.length - 1]); 
    }); 
} 
else if ('ontextInput' in $('#fake_input')[0]){ 
    $('#fake_input').on('textInput', function(e){ 
     App.insert_char(this.value[this.value.length - 1]); 
    }); 
} 

回答

8

這條線造成的「瓶頸」:this.value[this.value.length - 1],它只是緩慢。

試試這個:

更新時間:

$('#fake_input').keypress(function(e){ 
    $('#result').append(String.fromCharCode(e.which) + '<br />'); 
}).focus(); 

解釋。我假設你想使用keypress而不是keyup來捕捉字符。請注意,keyup與字符無關。它只會告訴你它收到的鍵盤信號的鍵碼。使用keypress,您可以確定案例,因爲您獲得了角色的鍵碼。

http://jsfiddle.net/YkaBm/8/

問候。

+0

這將無法正常工作,因爲如果通過Alt + 0192 –

+0

輸入了該字符,它會起作用,現在這是一個更好的版本。 http://jsfiddle.net/YkaBm/8/ –

+0

我站好了。 :)我最好刪除我正在處理的答案! –