如何检测单个控制键盘事件而不是键组合?

时间:2015-10-11 02:14:15

标签: javascript google-chrome events javascript-events google-chrome-extension

使用

轻松检测while (c != '\n' && c != EOF) c = fgetc(file); 关键事件
control

问题是,document.addEventListener('keyup', handler, false); ... function handler(e) { var key = e.which || e.keyCode; if (key == 17) { // Control key ... } } control-c等任何组合键也会触发事件,而事件处理程序似乎无法区分单个control-v和{{ 1}}在control

我想要的是只允许一键按下并释放,而不是按键组合来触发事件。

3 个答案:

答案 0 :(得分:2)

这个怎么样:

var controlConsidered = false;

function ctrlPressed() {
  console.log("Control was pressed.");
}

function keydownhandler(e) {
  var key = e.which || e.keyCode;
  controlConsidered = (key == 17);
}

function keyuphandler(e) {
  var key = e.which || e.keyCode;
  if (key == 17 && controlConsidered) {
    ctrlPressed();
  }
}

document.addEventListener('keydown', keydownhandler, false);
document.addEventListener('keyup', keyuphandler, false);

答案 1 :(得分:0)

您实际上可以使用e.ctrlKeye.altKey,根据是否按下这些键,该值将为true或false。

在您的活动中,它将类似于:

if (e.ctrlKey || e.altKey) {
    return;
}

编辑

供参考,您可以查看https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/ctrlKey

此属性实际上是一个布尔值,返回触发事件时是否按下了ctrl键。

然后,你可以看到,如果用户决定按下ctrl键而没有其他键,则此方法将不会返回并且e.ctrlKey将为false,因为当keyUp事件被触发时,用户已经释放钥匙。

答案 2 :(得分:0)

这并不是完全被问到的,但是对于好奇,下面的代码可以处理按下单个控制键和双击控制按键。它的工作原理如下:

  1. 完全按照Josiah's answer中的说明检测有效的单一控制键事件。如果检测到,则触发ctrlPressed,其中:
  2. 跟踪按下控制键的前两个时间戳,
  3. 每次触发时都会初始化特定threshold值的超时(以毫秒为单位),并且,
  4. 如果有双击控件(时间戳差异在阈值范围内),则取消之前的超时,否则不会。
  5. var lastControlTime = 0,
      newControlTime, timeout,
      threshold = 200;
    
    function ctrlPressed() {
      newControlTime = new Date();
    
      var bool = newControlTime - lastControlTime <= threshold;
    
      if (!bool)
        timeout = setTimeout(function() {
          if (timeout) {
            alert("Single control key pressed");
            timeout = undefined;
          }
        }, threshold);
    
      if (bool) {
        alert("Double control key pressed");
        clearTimeout(timeout);
        timeout = undefined;
      }
    
      lastControlTime = newControlTime;
    }
    
    function keydownhandler(e) {
      var key = e.which || e.keyCode;
      controlConsidered = (key == 17);
    }
    
    function keyuphandler(e) {
      var key = e.which || e.keyCode;
      if (key == 17 && controlConsidered) {
        ctrlPressed();
      }
    }
    
    document.addEventListener('keydown', keydownhandler, false);
    document.addEventListener('keyup', keyuphandler, false);