2010-12-18 4 views
2

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

ありがとうございました。

答えて

3

以内に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](); 
       } 
      } 
     } 
} 

これは、簡単なクリーン(あなたはそれを書く方法を正確に依存)と拡張性があり、より多くのコマンドを追加すると、あなたはもちろん、非常に簡単ですコマンド機能などにパラメータを渡すことができるように変更してください。

+0

+1この完全で洗練されたソリューションがより多くの票を得られなかった理由はわかりません - 私は時限アプローチを好むが、これは完全に素晴らしい機能的な例。 – Basic

+0

私は "da full codez"を投稿していません。 –

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 
     } 
    } 
} 

//Do the action here、唯一の火災はgが100msの

関連する問題