在JS中检测双倍Ctrl键按下

7

我有一个自定义的CMS,希望添加一个“快捷菜单”,当用户在300毫秒内按下Ctrl键两次时触发。

我使用prototype,所以我的起点显然是:

Event.observe(document, 'keypress', function(event)
  { if(event.keyCode == Event.KEY_XYZ) { show_shortcuts});

目前我的解决方案是使用全局变量存储当前毫秒级时间,并在每次按键时检查是否发生了小于300毫秒的按键事件。

但也许有更加优雅的解决方案?


无法相信@Pekka 웃没有点赞的问题,这是第一个哈哈,我也发现了这个有用的问题,我正在寻找双重移位。 - ncubica
2个回答

9

这应该可行。如果没有其他键,如Alt或Shift同时按下,可以添加进一步的检查。希望它是自我解释的,如果不是,请询问并提供澄清。

var dblCtrlKey = 0;
Event.observe(document, 'keydown', function(event) {
  if (dblCtrlKey != 0 && event.ctrlKey) {
    alert("Ok double ctrl");
    dblCtrlKey = 0;
  } else {
    dblCtrlKey = setTimeout('dblCtrlKey = 0;', 300);
  }
});

https://jsfiddle.net/3tc26g7x/


它能工作,但是当Ctrl键按下300毫秒时也会触发。我需要添加一个“keyup”检查器,但这将作为基础。干杯! - Pekka
当我按住键时,它不会触发。可能是浏览器特定的问题(我正在使用Opera)。 - jitter
1
@Pekka 只需使用 keyup 即可 ;-) - yckart
@jitter,我尝试了你的解决方案,但按下 Ctrl 键一次后,dblCtrlKey 的值就会打印为 139。我不知道我错过了什么。如果您有剪贴板示例,我将不胜感激。 - bijayshrestha
@bijayshrestha 添加了一个 jsfiddle。dblCtrlKey 变量的值是无关紧要的。 - jitter

4

function doubleControlEvent() {
  if (event.key === 'Control') {
   timesCtrlClicked++
    if (timesCtrlClicked >= 2) {
      console.log('Double control')
      // Double Crtl is clicked add your code here
    }
    setTimeout(() => (timesCtrlClicked = 0), 200)
  }  
}

let timesCtrlClicked = 0;
document.addEventListener('keyup', doubleControlEvent, true)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接