2

ではVim、 を押しggてドキュメントの先頭に移動するか、go を押しddて現在の行を削除します。Web ページで同様の動作を実装するには? つまり、Web ページ環境で、2 つのキーを連続して押すイベントをキャプチャしてイベントをトリガーするにはどうすればよいでしょうか?

ありがとう。

4

2 に答える 2

5

すべてのキー プレス イベントを監視する必要があり、マルチプレス コンボの最初のキーを見つけたら、タイマーを開始します。タイマーがアクティブな間にコンボの 2 番目のキーが押された場合、何かを行います。

例 (疑似コード)

//for gg
var inCombo = false;
function KeyPress(Key) {
   if(Key=='g') {
      if(!inCombo) {
          inCombo = true;
          setTimeout('inCombo=false;', 100);
      } else {
          //Do the action here
      }
   }
}

,は100ms 以内に 2 回押された//Do the action here場合にのみ発火しますg

于 2010-12-18T14:30:12.607 に答える
3

できません。通常のキー イベントを登録し、キーを配列にプッシュするだけです。

これで、コマンドをチェックする関数を呼び出すことができます:

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

これはシンプルでクリーン (正確に記述する方法によって異なります) でスケーラブルです。さらにコマンドを追加するのは非常に簡単です。もちろん、コマンド関数などにパラメーターを渡すことができるように変更します。

于 2010-12-18T14:37:21.553 に答える