Сочетание нескольких клавиш в javascript - PullRequest
0 голосов
/ 08 апреля 2020

Я знаю, что есть похожие вопросы, но я не смог найти ответ, и я пытаюсь создать необычный ярлык для выполнения действия в соответствии с определенной c комбинацией клавиш. У меня нет примера, так как я не реализовал его, я пытаюсь выяснить, могу ли я это сделать или нет. У меня есть комбинация клавиш Ctrl, Shift, Alt, мета-ключей, которые я могу записать в javascript, моя проблема в том, что я хочу использовать общий ключ типа «g» и заставить его вести себя как Ctrl, Shift, Alt, мета и т. д. c, чтобы в сочетании с клавишами F1, F2, F3 выполнить функцию javascript с указанным c визуальным компонентом на экране. Например, я намереваюсь создать ярлык "Ctrl + 1 + F1" для выполнения действия в определенной таблице c на веб-странице, отображающей более одной таблицы на html. Может ли кто-нибудь ответить мне, если это можно сделать? если кто-то может, как я могу это сделать?

Ответы [ 3 ]

1 голос
/ 09 апреля 2020

Общий обзор алгоритма будет следующим:

Сохраните переменную типа Set, которая будет содержать все в настоящий момент нажатые клавиши. Всякий раз, когда вы получаете событие keydown / keyup, обновите этот набор, добавив / удалив любую нажатую / отпущенную клавишу. Прикрепите обработчики событий как можно выше - например, к тегу <body>, чтобы вы могли отлавливать все, что происходит на вашей странице.

Затем в конце события keydown вам следует проверьте, содержит ли переменная ТОЧНО те клавиши, которые требуются вашему сочетанию клавиш. Если они это сделают, запустите действие. На практике у вас, вероятно, будет длинный список возможных сочетаний клавиш. Проверьте их все. Возможно, вам также понадобятся дополнительные проверки, например, некоторые ярлыки могут быть активны, только когда определенный элемент управления находится в фокусе, или когда что-то находится в нужном состоянии или что-то в этом роде.

Как вариант, вы можете запустить действие не когда клавиши нажаты, а когда они отпущены. В этом случае не запускайте действие немедленно, а сделайте какое-то замечание в другой переменной, что такая-то комбинация была нажата. Затем подождите, пока все ключи не будут отпущены (набор пуст), а затем запустите действие. Если между ними были нажаты какие-то другие клавиши, очистите эту заметку и проверьте, не следует ли активировать другую комбинацию. Сохраните это в переменной note и продолжайте ждать.

0 голосов
/ 09 апреля 2020

Спасибо всем, собрав ответы, я смог решить проблему. я должен был сфокусироваться на столе (любезно предоставив ко sh, который дал прямой ответ, который мне нужен), и на посте (событии) веб-страницы я был способен поймать активный компонент. Я не могу опубликовать решение, которое я построил, потому что код принадлежит компании, но я постараюсь создать пример и опубликовать его в понедельник, если кто-то еще получит этот пост после того же сомнения (Пасха в Бразилии, а завтра я я еду домой, поэтому пример я покажу только в понедельник). Еще раз спасибо всем.

0 голосов
/ 09 апреля 2020

К сожалению, клавиши управления и функциональные клавиши кажутся взаимоисключающими. Вы можете настроить комбинации клавиш с любым количеством клавиш, как в следующем примере, но объединение управления и функции не работает (в любом случае, в моей системе).

const result = document.querySelector('#result')
const keys = {}

window.addEventListener('keydown', (ev) => {
  keys[ev.key] = true
})

window.addEventListener('keyup', (ev) => {
  if (keys['1'] && keys['Control'] && keys['F1']) {
    console.log('This does not work on my system')
  } else if (keys['1'] && keys['F1']) {
    result.value = "F1 + 1 pressed!"
  } else if (keys['Control'] && keys['o'] && keys['p']) {
    result.value = "Control + o + p pressed!"
  } else {
    setTimeout(() => result.value = "", 500)
  }
  keys[ev.key] = false
})
<p>Click in the result pane and then press F1+1, or Control+o+p. Control+F1+1 does not work.</p>
<input id="result">
...