Проверьте, не нажата ли клавиша?
Есть ли способ определить, находится ли в настоящее время ключ в JavaScript?
Я знаю о событии "keydown", но это не то, что мне нужно. Некоторое время ПОСЛЕ нажатия клавиши, я хочу, чтобы определить, все еще нажата.
Р. S. Самая большая проблема заключается в том, что после некоторого периода времени ключ начинает повторяться, отбрасывая ключевые события и ключевые события, такие как дьявол. Надеюсь, что есть простая функция isKeyDown (key), но если нет, то эту проблему нужно будет преодолеть/обойти.
Ответы
Ответ 1
Есть ли способ определить, находится ли в настоящее время ключ в JavaScript?
Неа. Единственная возможность - следить за каждым keyup
и keydown
и запоминать.
после некоторого периода времени ключ начинает повторяться, вызывая отключение клавиш и события клавиш, например, дьявола.
Не следует. Вы обязательно получите повторение keypress
, и во многих браузерах вы также получите повторяющийся keydown
, но если keyup
повторится, это ошибка.
К сожалению, это не совсем неслыханная ошибка: в Linux, Chromium и Firefox (когда он запускается под GTK +, который находится в популярных дистрибутивах, таких как Ubuntu) генерирует повторяющиеся последовательности keyup-keypress-keydown для которые невозможно отличить от того, кто быстро забивает ключ.
Ответ 2
В дополнение к прослушивателям keyup
и keydown
для отслеживания, когда клавиша сбрасывается и выполняется резервное копирование, на самом деле есть некоторые свойства, которые говорят вам, если некоторые ключи опущены.
window.onmousemove = function (e) {
if (!e) e = window.event;
if (e.shiftKey) {/*shift is down*/}
if (e.altKey) {/*alt is down*/}
if (e.ctrlKey) {/*ctrl is down*/}
if (e.metaKey) {/*cmd is down*/}
}
Это доступно для всех объектов событий, созданных браузером, таких как теги keydown
, keyup
и keypress
, поэтому вам не нужно использовать mousemove.
Я попытался создать собственные объекты событий с document.createEvent('KeyboardEvent')
и document.createEvent('KeyboardEvent')
и искать e.shiftKey
и т.д., но мне не повезло.
Я использую Chrome 17 на Mac
Ответ 3
Мое решение:
var keys = [];
window.onkeyup = function(e) {keys[e.keyCode]=false;}
window.onkeydown = function(e) {keys[e.keyCode]=true;}
Теперь я могу проверить, нажата ли какая-либо клавиша в любом месте в script, проверив
keys["code of the key"]
Если это правда, клавиша нажата.
Ответ 4
Я не верю, что есть что-то вроде функции isKeyDown, но вы можете написать свой собственный.
В принципе, создайте массив, длина которого - это количество ключей, которые вы хотите контролировать. Затем, используя документы/страницы/элементы управления keyUp и keyDown, обновите массив с этим состоянием ключа.
Затем напишите функцию, которая проверяет, отключен ли определенный ключ и возвращает bool.
var keyEnum = { W_Key:0, A_Key:1, S_Key:2, D_Key:3 };
var keyArray = new Array(4);
function onKeyDown()
{
// Detect which key was pressed
if( key == 'w' )
keyArray[keyEnum.W_Key] = true;
// Repeat for each key you care about...
}
function onKeyUp()
{
// Detect which key was released
if( key == 'w' )
keyArray[keyEnum.W_Key] = false;
// Repeat for each key you care about...
}
function isKeyDown(key)
{
return keyArray[key];
}
Это должно выполнить то, что вы хотите.
Ответ 5
Другие люди задавали этот вопрос раньше (хотя я не вижу здесь очевидных обманов).
Я думаю, что ответ заключается в том, что событие keydown
(и его близнец keyup
) - это вся информация, которую вы получаете. Повторение довольно прочно подключено к операционной системе, и прикладная программа не получает большой возможности запросить BIOS для фактического состояния ключа.
Что вы можете делать, и, возможно, придется, если вам нужно, чтобы это работало, - это программный отказ от ключа. По существу, вы можете сами оценить keydown
и keyup
, но проигнорировать событие keyup
, если это происходит слишком быстро после последнего keydown
... или по существу, вы должны отложить свой ответ на keyup
достаточно долго, чтобы убедитесь, что нет другого события keydown
, следующего за чем-то вроде 0,25 секунды keyup
.
Это предполагает использование активности таймера и запись миллисекундных раз для предыдущих событий. Я не могу сказать, что это очень привлекательное решение, но...
Ответ 6
/*
Tracks what keys are currently down on the keyboard
*/
function keyboard_module(onUpdate){
var kb = {};
var unicode_mapping = {};
document.onkeydown = function(e){
var unicode=e.charCode? e.charCode : e.keyCode
var key = getKey(unicode);
kb[key] = true;
if(onUpdate){
onUpdate(kb);
}
}
document.onkeyup = function(e){
var unicode=e.charCode? e.charCode : e.keyCode
var key = getKey(unicode);
delete kb[key];
if(onUpdate){
onUpdate(kb);
}
}
function getKey(unicode){
if(unicode_mapping[unicode]){
var key = unicode_mapping[unicode];
}else{
var key= unicode_mapping[unicode] = String.fromCharCode(unicode);
}
return key;
}
return kb;
}
function testing(kb){
console.log('These are the down keys', kb);
}
var keyboard = keyboard_module(testing);
....
//somewhere else in the code
if(keyboard['K']){/*do something special */}
Ответ 7
Следующий код - это то, что я использую:
var altKeyDownCount = 0;
window.onkeydown = function (e) {
if (!e) e = window.event;
if (e.altKey) {
altKeyDownCount++;
if (30 < altKeyDownCount) {
$('.key').removeClass('hidden');
altKeyDownCount = 0;
}
return false;
}
}
window.onkeyup = function (e) {
if (!e) e = window.event;
altKeyDownCount = 0;
$('.key').addClass('hidden');
}
Когда пользователь удерживает клавишу Alt в течение некоторого времени (около 2 секунд), появляется группа меток (class= 'hidden). Когда клавиша Alt отпущена, метки исчезают. Используются jQuery и Bootstrap.
Ответ 8
Посмотрите на этот ответ и используйте onkeyup
и onkeydown
. Здесь более конкретная информация об этих событиях.
Ответ 9
$('#mytextbox').keydown(function (e) {
if (e.keyCode == 13) {
if (e.altKey) {
alert("alt is pressed");
}
}
});
если вы нажмете alt + enter, вы увидите предупреждение.