Я делаю небольшую игру слов, где мне нужно получить последний 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]);
});
}