【问题标题】:press two continuous key to trigger an event in JavaScript按两个连续键触发 JavaScript 中的事件
【发布时间】:2010-12-18 14:23:14
【问题描述】:

Vim,你可以按gg去文档的开头,或者按dd去删除当前行。如何在网页中实现类似的行为?我的意思是,在网页环境中,如何捕获两个连续的按键事件来触发一个事件?

谢谢。

【问题讨论】:

    标签: javascript vim key keypress keycode


    【解决方案1】:

    您需要监控所有按键事件,当您找到可能是多次按键组合中的第一个按键时,启动计时器。如果在计时器处于活动状态时按下组合中的第二个键,请执行一些操作。

    例如(伪代码)

    //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,只有在 100 毫秒内按两次 g 才会触发

    【讨论】:

      【解决方案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]();
                    }
                }
            }
       }
      

      这很简单,干净(取决于您编写它的方式)和可扩展性,添加更多命令非常容易,当然您可以更改它以便将参数传递给命令函数等。

      【讨论】:

      • +1 我不知道为什么这个完整而优雅的解决方案没有获得更多投票 - 显然我更喜欢我的定时方法,但这是一个非常好的、功能齐全的示例。
      • 好吧,我还没有发布“da full codez”,这会立即将您在这里获得的赞成票数量减少 1000 倍;)
      猜你喜欢
      • 1970-01-01
      • 2017-06-18
      • 2021-11-19
      • 1970-01-01
      • 2013-03-18
      • 2012-08-17
      • 1970-01-01
      • 2011-12-20
      • 1970-01-01
      相关资源
      最近更新 更多