Есть ли способ определить, не работает ли в данный момент ключ в JavaScript?
Я знаю о событии "keydown", но мне это не нужно. Через некоторое время ПОСЛЕ нажатия клавиши я хочу иметь возможность определять, нажата ли она еще.
PS Самая большая проблема, кажется, заключается в том, что через некоторый период времени клавиша начинает повторяться, запуская события keydown и keyup, как злодей. Надеюсь, есть простая функция isKeyDown (key), но если нет, то эту проблему нужно будет преодолеть / обойти.
javascript
input
keyboard
Дэниел Икс Мур
источник
источник
Ответы:
Неа. Единственная возможность мониторинга каждого
keyup
иkeydown
и запоминания.Не должно. Вы обязательно получите
keypress
повторение, и во многих браузерах вы также будете повторятьсяkeydown
, но еслиkeyup
повторяется, это ошибка.К сожалению, это не совсем неслыханная ошибка: в Linux, Chromium и Firefox (когда он работает под GTK +, который есть в популярных дистрибутивах, таких как Ubuntu) оба генерируют повторяющиеся последовательности keyup-keypress-keydown для удерживаемых ключей, которых невозможно отличить от тех, кто очень быстро забивает ключ.
источник
keyup
событий.В дополнение к использованию
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
источник
Мое решение:
var pressedKeys = {}; window.onkeyup = function(e) { pressedKeys[e.keyCode] = false; } window.onkeydown = function(e) { pressedKeys[e.keyCode] = true; }
Теперь я могу проверить, нажата ли какая-либо клавиша где-нибудь еще в сценарии, проверив
pressedKeys["code of the key"]
Если это правда, клавиша нажата.
источник
Я не верю, что есть что-то вроде функции isKeyDown, но вы могли бы написать свою собственную.
По сути, создайте массив, длина которого равна количеству ключей, которые вы хотите отслеживать. Затем с помощью событий keyUp и keyDown documents / pages / controls обновите массив, указав состояние этого ключа.
Затем напишите функцию, которая проверяет, не нажата ли определенная клавиша, и возвращает логическое значение.
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]; }
Это должно выполнить то, что вы хотите.
источник
Заканчивается здесь, чтобы проверить, было ли что-то встроено в браузер, но похоже, что это не так. Это мое решение (очень похоже на ответ Роберта):
"use strict"; const is_key_down = (() => { const state = {}; window.addEventListener('keyup', (e) => state[e.key] = false); window.addEventListener('keydown', (e) => state[e.key] = true); return (key) => state.hasOwnProperty(key) && state[key] || false; })();
Затем вы можете проверить, нажата ли клавиша, с помощью
is_key_down('ArrowLeft')
.источник
Другие люди задавали подобные вопросы раньше (хотя сейчас я не вижу здесь очевидных дураков).
Я думаю, ответ состоит в том, что
keydown
событие (и его двойникkeyup
) - это вся информация, которую вы получаете. Повторение довольно прочно встроено в операционную систему, и прикладная программа не имеет особых возможностей запрашивать у BIOS фактическое состояние ключа.Что вы можете сделать, и, возможно, придется, если вам нужно заставить это работать, - это программно разблокировать ключ. По сути, вы можете оценивать
keydown
иkeyup
себя, но игнорироватьkeyup
событие, если оно происходит слишком быстро после последнегоkeydown
... или, по сути, вы должны отложить свой ответ наkeyup
достаточно долгое время, чтобы быть уверенным, что за ним не последует другоеkeydown
событие с примерно 0,25 секундамиkeyup
.Это потребует использования таймера и записи миллисекунд для предыдущих событий. Не могу сказать, что это очень привлекательное решение, но ...
источник
/* 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 */}
источник
Я использую следующий код:
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 = 'key hidden'). Когда клавиша Alt отпускается, метки исчезают. Используются оба jQuery и Bootstrap.
источник
Я знаю, что это очень старый вопрос, однако существует очень легкая (~ .5 КБ) библиотека JavaScript, которая эффективно «исправляет» непоследовательный запуск обработчиков событий клавиатуры при использовании DOM API.
Библиотека - Keydrown .
Вот пример действующего кода, который хорошо сработал для моих целей, просто изменив ключ, на котором нужно установить слушателя:
kd.P.down(function () { console.log('The "P" key is being held down!'); }); kd.P.up(function () { console.clear(); }); // This update loop is the heartbeat of Keydrown kd.run(function () { kd.tick(); });
Я включил Keydrown в свой клиентский JavaScript для правильной анимации паузы в игре Red Light Green Light, которую я пишу. Вы можете просмотреть всю игру здесь . (Примечание: если вы читаете это в будущем, игра должна иметь полный код и воспроизводиться :-D!)
Надеюсь, это поможет.
источник
Я просмотрел выше ответы и предлагаемый
keydown
/keyup
подход работает только при особых обстоятельствах. Если пользователь отключает Alt-Tab или использует ключевой жест для открытия нового окна или вкладки браузера, тогдаkeydown
будет зарегистрирован a , и это нормально, потому что в этот момент невозможно определить, является ли ключ тем, что отслеживает веб-приложение. , либо стандартный ярлык браузера или ОС. Вернувшись на страницу браузера, он все равно будет думать, что ключ удерживается, хотя к тому времени он был выпущен. Или какая-то клавиша просто удерживается, пока пользователь переключается на другую вкладку или приложение с помощью мыши, а затем отпускается за пределы нашей страницы.Клавиши-модификаторы (
Shift
и т. Д.) Можно отслеживать с помощьюmousemove
и т. Д., Предполагая, что при переходе назад ожидается хотя бы одно взаимодействие с мышью, что часто имеет место.Для большинства всех остальных клавиш (кроме модификаторов,
Tab
,Delete
, но в то числеSpace
,Enter
), мониторингkeypress
будет работать для большинства приложений - ключ удерживается в нажатом положении будет продолжать огнь. Однако есть некоторая задержка при сбросе ключа из-за периодичностиkeypress
срабатывания. В принципе, еслиkeypress
не продолжать стрелять, то можно исключить большинство ключей. Это в сочетании с модификаторами довольно герметично, хотя я не изучал, что делать сTab
иBackspace
.Я уверен, что есть какая-то библиотека, которая абстрагируется от этой слабости DOM, или, может быть, какое-то стандартное изменение DOM позаботилось об этом, поскольку это довольно старый вопрос.
источник
Посмотрите на этот ответ и используйте
onkeyup
иonkeydown
. Вот более конкретная информация об этих событиях.источник
Это работает в Firefox и Chrome.
Мне нужно было открыть специальный файл html локально (нажав,
Enter
когда файл выбран в проводнике файлов в Windows), либо просто для просмотра файла, либо для его редактирования в специальном онлайн-редакторе.Поэтому я хотел различать эти два параметра, удерживая
Ctrl
клавишу -клавишу или нет при нажатииEnter
.Как вы все поняли из всех ответов здесь, это кажется невозможным, но вот способ, который имитирует это поведение таким образом, который был приемлем для меня.
Это работает так:
Если вы удерживаете нажатой
Ctrl
клавишу при открытии файла, событие нажатия клавиши никогда не сработает в коде javascript. Но произойдет событие нажатия клавиши (когда вы наконец отпуститеCtrl
клавишу). Код это фиксирует.Код также отключает ключевые события (как нажатие, так и нажатие), как только происходит одно из них. Так что, если вы нажмете
Ctrl
клавишу после открытия файла, ничего не произойдет.window.onkeyup = up; window.onkeydown = down; function up(e) { if (e.key === 'F5') return; // if you want this to work also on reload with F5. window.onkeyup = null; window.onkeyup = null; if (e.key === 'Control') { alert('Control key was released. You must have held it down while opening the file, so we will now load the file into the editor.'); } } function down() { window.onkeyup = null; window.onkeyup = null; }
источник
$('#mytextbox').keydown(function (e) { if (e.keyCode == 13) { if (e.altKey) { alert("alt is pressed"); } } });
если вы нажмете alt + enter, вы увидите предупреждение.
источник