Кросс-браузер получить код ключа
Я пытаюсь получить кросс-браузерный способ прослушивания keyCode
пользователя keyDown
,
Для мобильных браузеров мне нужно активировать виртуальную клавиатуру, поэтому я использую ввод, скрытый css, запускаемый с помощью click
событие. Это работает хорошо, за исключением того, что, когда я пытаюсь прослушать код ключа на fennec (мобильный Firefox), у меня странное поведение.
Вот функция, которую я использую, чтобы слушать keycode
,
document.querySelectorAll('input')[0].addEventListener('keydown', handler);
function handler(e) {
e.preventDefault();
var k = (e.which) ? e.which : e.keyCode;
document.getElementById('log').innerHTML = k;
this.style.backgroundColor = "#FFAAFF";
}
<input type="text" />
<span id="log"></span>
В Firefox для Android (с v34 по v37) он не сработает, пока пользователь не введет return ⏎.
На самом деле, я обнаружил, что если значение ввода не пусто, оно работает хорошо, по крайней мере, при загрузке. Поэтому я подумал об обходном пути, подобном этому:if(this.value=='')this.value='*';
Кажется, работает, но если вы спамите, Backspace sp не блокируется, поэтому, когда ввод очищен, ошибка возвращается: обходной путь также не срабатывает.
+ Это уродливый обходной путь, который, я уверен, создаст другие ошибки в других браузерах.document.querySelectorAll('input')[0].addEventListener('keydown', handler); function handler(e) { if(this.value=='')this.value='*'; e.preventDefault(); var k = (e.which) ? e.which : e.keyCode; document.getElementById('log').innerHTML = k; this.style.backgroundColor = "#FFAAFF"; }
<input type="text" value="*"/> <span id="log"></span>
В B2G (Firefox Os 1.3 на устройстве или в эмуляции 2.0) поведение еще более странное:
функция только читаетkeyCode
для возврата ⌫ (код клавиши8
) или вернуть ⏎ (keyCode13
) ключи. Любой другой ключ вернется0
,
Итак, мой вопрос, знаете ли вы лучший кросс-браузерный способ слушать keyCode
Один работает во всех основных браузерах, настольных или мобильных, и на fennec?
PS: даже если я напишу свое приложение на vanilla-js, я смогу найти решение для любой библиотеки.
1 ответ
Не существует идеального решения для прослушивания KeyCode в разных браузерах и ОС... Просто потому, что в javascript используются те же коды клавиш, которые сообщаются операционной системой, в которой он работает. Вам будет лучше использовать input
событие вместо keyDown
По данным этого сайта input
событие происходит, когда текстовое содержимое элемента изменяется через пользовательский интерфейс, что вам и нужно, потому что в некоторых мобильных браузерах / ОС события не запускаются до тех пор, пока пользователь не введет ввод, а change
событие пожары.
$(document).ready(function () {
var inputEvent = 'oninput' in window ? 'input' : 'keyup';
$('#listen').on(inputEvent, function (event) {
$('#show').val($('#show').val() + '\n' + event.type);
console.log('--- input event ----');
for (var v in event.originalEvent) {
if (event.hasOwnProperty(v)) {
console.log(v + ' |---> ' + event[v]);
}
}
})
//just added to see what Silk listens for on the keyup event
$('#listen').on('keyup', function (event) {
$('#show').val($('#show').val() + '\n' + event.type + ' | which --> ' + event.which);
console.log('--- keyup event ----');
for (var v in event.originalEvent) {
if (event.hasOwnProperty(v)) {
console.log(v + ' |-.-> ' + event[v]);
}
}
})
});
input {
font-size: 22px
}
input, textarea {
width:300px;
}
textarea {
height:300px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<div>
<input type='text' id="listen" />
<br/>
<br/>
<textarea type='text' id="show"></textarea>
</div>