Получение правильного символа на клавиатурном событии

Я делаю небольшую игру слов, где мне нужно получить последний char, который пользователи вводят на своих клавиатурах. Я решил два способа сделать это.

Сначала нужно получить каждый char, прослушивая событие на клавиатуре документа и получая его по коду. Он работал очень хорошо, пока я не начал писать символы с клавиатурными клавишами (например, Ā). String.fromCharCode(e.keyCode) переводит его в в качестве ключевого кода для A, но, похоже, ничего не происходит в событии относительно мертвого ключа или реального char, которое вызвало событие.

Второй заключается в том, чтобы сохранить скрытый ввод, всегда сфокусированный (плохой), и на событие клавиатуры получать последний char входного значения, но это работает, только если я пишу довольно медленно. Мой код выглядит следующим образом:

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/ - вы должны получить одно и то же слово ниже ввода, но когда вы пишете немного быстрее, он поворачивается неправильно.

Есть ли у вас какие-либо предложения о том, как получить реальный (правильный) символ на клавиатурном мероприятии или почему событие ввода keyup действует следующим образом?

Обновление

Как я уже упоминал в комментариях, semir.babajic ответ не совсем сработал для моего случая, но благодаря Semir я обнаружил, что это глупое решение работает:

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]);
    });
}

Ответ 1

Эта строка вызывала "узкое место": 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/

С уважением.