нажмите две непрерывные клавиши, чтобы вызвать событие в JavaScript
В Vim
можно нажать gg
, чтобы перейти к началу документа, или нажать dd
, чтобы удалить текущую строку. Как реализовать подобное поведение на веб-странице? Я имею в виду, в среде веб-страницы, как я могу захватить два непрерывных события нажатия клавиши, чтобы вызвать событие?
Спасибо.
2 ответа:
Вы не можете просто зарегистрировать обычное ключевое событие и поместить ключи в массив.
Теперь вы можете вызвать функцию, которая проверяет наличие команд:
// More or less pseudo code function deleteLine(){}; function copyLine(){}; var commands = {'dd': deleteLine, 'yy': copyLine}; function onKeyPress(e) { keyList.push(e.key); // in this example keyList = ['d', 'y', 'i', 'd', 'd'] var result = handleEvent(); } function handleEvent(keyList) { // more pseudo code follows var cmds = commands.keyValue.sortByLengthDescending(); for(var c in cmds) { // match the keys var ckey = c.split(''); for(var i = keyList.length; i >= 0; i--) { if (keyList[i] !== ckey.shift()) { break; } if (ckey.length === 0) { return commands[c](); } } } }
Это просто, чисто (зависит от того, как именно вы пишете его) и масштабируемо, добавление дополнительных команд довольно легко, конечно, вы изменяете его так, чтобы вы могли передавать параметры в командную функцию и т. д.
Вам нужно будет отслеживать все события нажатия клавиш, и когда вы найдете ключ, который, возможно, является первым в комбинации нескольких нажатий, запустите таймер. Если вторая клавиша в комбинации нажата во время работы таймера, сделайте что-нибудь.
Например (псевдокод)
//for gg var inCombo = false; function KeyPress(Key) { if(Key=='g') { if(!inCombo) { inCombo = true; setTimeout('inCombo=false;', 100); } else { //Do the action here } } }
//Do the action here
, будет срабатывать только в том случае, еслиg
нажата дважды в течение 100 мс