3

我正在尝试检测 javascript 中的一些组合键。我需要检测Ctrl+ LeftCtrl+ RightRightLeft.

到目前为止,我只是想检测何时Ctrl按下。这是我所拥有的(JSFiddle 链接):

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

我想我真的不明白 JQueryinArray应该如何工作,因为当我按下任何键时,它只会返回 -1。if 语句的计算结果也为 true,而我只希望它在Ctrl按下时这样做。我该如何解决这个问题,以便我的 if 语句正确检测到Ctrl被按下?一旦我让它正常工作,我将能够解决剩下的问题。

编辑:更改 if 语句以评估inArray返回> -1

4

5 回答 5

3

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

尽管与您尝试做的事情并不完全相关,但您应该能够弄清楚您应该前进的方向。

于 2013-10-21T18:45:00.080 回答
1

找出是否ctrl被按下的最简单方法是测试event对象的ctrlKey属性:

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

JS 小提琴演示

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

于 2013-10-21T18:43:19.173 回答
1

首先,keys 不是一个数组——它是一个对象。因此,您可以简单地编写,而不是函数中的 2 个单独的 if 块:

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

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

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

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

最后,要检测是否 ctrl +(任何其他键),只需检查which事件上的属性是否对应于您要查找的keyCodes之一

于 2013-10-21T18:44:03.587 回答
0

首先,您缺少{}else 案例的大括号。

js 小提琴演示

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

Ctrl运行演示并在单击键时观看文本“ctrl”显示。

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

在这里检测 Ctrl + left Demo

$(document).keydown(function(e){
    if(e.keyCode == 37 && e.ctrlKey)
        alert("Control + Left Clicked"); 
});
于 2013-10-21T18:42:52.450 回答
0

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

  • ctrlKey-Control按键是否被按下?
  • shiftKey- Shift按键是否被按下?
  • altKey- 是否按下了 ifAlt键?

所有这些属性都是boolean值(true如果按下按钮,则为 ` false)。

这是 JSFiddle 中上述属性的演示

于 2013-10-21T18:57:24.617 回答