2013-10-21 55 views
2

我试图在javascript中检测多个按键组合。我需要检测按Ctrl +按Ctrl +右键,并在javascript中检测多个按键

到目前为止,我只是试图检测何时按下Ctrl。下面是我有(JSFiddle link):

var keys = {}; 

$(document).keydown(function (e) { 
    keys[e.which] = true; 

    printKeys(); 
}); 

$(document).keyup(function (e) { 
    delete keys[e.which]; 

    printKeys(); 
}); 

function printKeys() { 
    var html = ''; 
    for (var i in keys) { 
     html += '<p>i: ' + i + '</p>' 
     if (!keys.hasOwnProperty(i)) continue; 
     if ($.inArray(17, keys) > -1) 
      html += '<p>ctrl was pressed, return val: ' + $.inArray(17, keys) + '</p>' 
    } 
    $('#out').html(html); 
} 

我想我真的不知道如何JQuery的inArray应该工作,因为当我按下任何键,它只返回-1。 if语句也评估为true,而我只希望它按Ctrl。我该如何解决这个问题,以便我的if语句正确检测到Ctrl被按下?一旦我得到了正确的工作,我就可以找出其他问题。

编辑:改变if语句来评价inArray返回> -1

+2

['$ .inArray'](http://api.jquery.com/jQuery.inArray)< - 如果你不明白它是如何工作的话,可能是一个很好的开始:) –

+0

@AndrewWhitaker谢谢安德鲁,if语句现在读取'if($ .inArray(17,keys)> -1)'尽管'html + ='

i''+ i +'

'popping仍然没有选择17出17。 – tnw

回答

2

在javascript中,您需要捕获window.event.ctrlKey的值来检测控制键是否被按下。下面是将使用ctrl+v键盘快捷键使用,以阻止粘贴从剪贴板到字段的功能的例子:

function BlockControlV() { 
     var keyPressed = window.event.keyCode; 
     var ctrlPressed = window.event.ctrlKey; 
     if (ctrlPressed && keyPressed == 86) { 

      var ClipBoardData = window.clipboardData.getData('Text') 
      ClipBoardData = trim(ClipBoardData) 

      if (ClipBoardData != '') { 
       if (isNaN(ClipBoardData) == true) { 
        window.event.keyCode = 0; 
       } 
      } 
      else { 
       window.event.keyCode = 0; 
      } 
     } 
    } 

虽然不完全是你正在试图做什么相关的,你应该能够找出你应该前进的方向。

+1

谢谢,这实际上确实很好。公认。 – tnw

0

首先,你失踪括号{}的其他情况。

js Fiddle DEMO

if (i == 17) { 
    html += '<p>ctrl</p>'; 
} else {} 

运行演示&观看文本 “CTRL” 显示,同时单击Ctrl关键。

e.ctrlKey是检测Ctrl键点击的最简单方法。

为了检测按Ctrl +左Demo here

$(document).keydown(function(e){ 
    if(e.keyCode == 37 && e.ctrlKey) 
     alert("Control + Left Clicked"); 
}); 
1

找出CTRL是否按最简单的方法,是测试event对象为ctrlKey属性:

$(document).keypress(function(e){ 
    console.log(e.which, e.ctrlKey); 
}); 

JS Fiddle demo

我会提供一个更相关的演示,但我不知道该演示的目的是实现什么。

1

首先,键不是一个数组 - 它是一个对象。因此,而不是在你的函数的2个独立的,如果块,你可以简单的写:

if (keys.hasOwnProperty(i)) { 
    ... 
} 

其次,jQuery的追加一个非常方便的属性的事件对象:ctrlKey

在您的keydown事件处理程序,包调用printKeys在if语句:

if (e.ctrlKey) { 
    printKeys(); 
} 

最后,检测CTRL +(其它键)是否只是检查是否which财产的事件对应到keyCodes您正在寻找

+0

了解。虽然这回答了我检测ctrl键的问题,但我没有看到如何使用它来检测'ctrl + left'或类似的东西。 – tnw

0

您可以使用返回的event对象轻松检测到它。此对象还包含所有control keys信息:

  • ctrlKey - 不被按下的键Control
  • shiftKey - Shift键是否被按下?
  • altKey - 如果Alt键被按下了吗?

所有这些特性是boolean值(true,如果按钮被按下,otherwise` false)。

这里是JSFiddle上述属性的示例。