нажмите две непрерывные клавиши, чтобы вызвать событие в JavaScript - PullRequest
2 голосов
/ 18 декабря 2010

В Vim вы можете нажать gg, чтобы перейти к началу документа, или нажмите dd, чтобы удалить текущую строку.Как реализовать подобное поведение на веб-странице?Я имею в виду, в среде веб-страницы, как я могу захватить два события непрерывного нажатия клавиши, чтобы вызвать событие?

Спасибо.

Ответы [ 2 ]

5 голосов
/ 18 декабря 2010

Вам нужно будет отслеживать все события нажатия клавиш, и когда вы найдете клавишу, которая, возможно, является первой в комбинированной комбинации, нажмите таймер.Если вторая клавиша в комбинированном режиме нажата, когда таймер активен, сделайте что-нибудь.

например (псевдокод)

//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 мс

3 голосов
/ 18 декабря 2010

Вы не можете.Просто зарегистрируйте нормальное событие ключа и вставьте ключи в массив.

Теперь вы можете вызывать функцию, которая проверяет команды:

 // 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]();
              }
          }
      }
 }

Это просто, чисто (зависит от того, как именно вы это напишите) и масштабируемое, добавление большего количества команд довольно легкоКонечно, вы можете изменить его, чтобы передать параметры в командную функцию и т. д.

...