JQuery或JavaScript:如何在单击锚标签超链接时确定是否按下了shift键?

Pet*_*vin 85 javascript jquery

我有一个调用JavaScript函数的锚标记.

无论是否使用JQuery,如何在单击链接时确定shift键是否已关闭?

以下代码不起作用,因为只有按下"真实键"(不是shift键)才会触发按键.(我希望如果仅按下shift键就会触发它.)

var shifted = false;

$(function() {                           
    $(document).keypress(function(e) {
        shifted = e.shiftKey;
        alert('shiftkey='+e.shiftkey);
    });

    $(document).keyup(function(e) {
        shifted = false;
    });
}

...

function myfunction() {
  //shift is always false b/c keypress not fired above
}
Run Code Online (Sandbox Code Playgroud)

hlu*_*luk 97

    $(document).on('keyup keydown', function(e){shifted = e.shiftKey} );
Run Code Online (Sandbox Code Playgroud)

  • 这对我有用,但中断了所有不涉及`shift`的标准快捷键,因为函数返回`false`.我需要明确地"返回true"以允许crtl + r,ctrl + s,ctrl + p等. (20认同)
  • 因此建议使用keydown而不是keypress. (4认同)

Jsi*_*inh 69

以下是JavaScript中每个键击的关键代码.您可以使用它并检测用户是否按下了Shift键.

backspace           8
tab                 9
enter               13
shift               16
ctrl                17
alt                 18
pause/break         19
caps lock           20
escape              27
page up             33
page down           34
end                 35
home                36
left arrow          37
up arrow            38
right arrow         39
down arrow          40
insert              45
delete              46
0                   48
1                   49
2                   50
3                   51
4                   52
5                   53
6                   54
7                   55
8                   56
9                   57
a                   65
b                   66
c                   67
d                   68
e                   69
f                   70
g                   71
h                   72
i                   73
j                   74
k                   75
l                   76
m                   77
n                   78
o                   79
p                   80
q                   81
r                   82
s                   83
t                   84
u                   85
v                   86
w                   87
x                   88
y                   89
z                   90
left window key     91
right window key    92
select key          93
numpad 0            96
numpad 1            97
numpad 2            98
numpad 3            99
numpad 4            100
numpad 5            101
numpad 6            102
numpad 7            103
numpad 8            104
numpad 9            105
multiply            106
add                 107
subtract            109
decimal point       110
divide              111
f1                  112
f2                  113
f3                  114
f4                  115
f5                  116
f6                  117
f7                  118
f8                  119
f9                  120
f10                 121
f11                 122
f12                 123
num lock            144
scroll lock         145
semi-colon          186
equal sign          187
comma               188
dash                189
period              190
forward slash       191
grave accent        192
open bracket        219
back slash          220
close braket        221
single quote        222
Run Code Online (Sandbox Code Playgroud)

并非所有浏览器都能很好地处理keypress事件,因此请使用key up或key down事件,如下所示:

$(document).keydown(function (e) {
    if (e.keyCode == 16) {
        alert(e.which + " or Shift was pressed");
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 请改用“event.key”!它会直接给你字符,例如:“a”,“1”,“LeftArrow” (2认同)

Poi*_*nty 25

对于鼠标事件,我知道在Firefox中,至少事件对象上的"shiftKey"属性会告诉您shift键是否已关闭.它在MSDN上有记录,但我没有永远尝试过,所以我不记得IE是否正确.

因此,您应该能够在"click"处理程序中检查事件对象上的"shiftKey".

  • 的确。这种情况可以追溯到 JavaScript 的早期。 (2认同)

ton*_*and 23

我遇到了类似的问题,尝试捕获'shift + click',但由于我使用的是带有回调而不是标准click处理程序的第三方控件,因此我无法访问事件对象及其关联e.shiftKey.

我最终处理鼠标按下事件以记录移位,然后在我的回调中使用它.

    var shiftHeld = false;
    $('#control').on('mousedown', function (e) { shiftHeld = e.shiftKey });
Run Code Online (Sandbox Code Playgroud)

发布以防万一其他人最终在这里寻找这个问题的解决方案.


Chr*_*tal 6

keypress当您单击shift或时ctrl,所有浏览器都不会触发该事件,但幸运的keydown事件是.

如果你换掉了keypress,keydown你可能会有更好的运气.


Cor*_*rey 6

我已经使用一种方法来测试是否通过将当前按下的键代码存储在数组中来按下任何特定键:

var keysPressed = [],
    shiftCode = 16;

$(document).on("keyup keydown", function(e) {
    switch(e.type) {
        case "keydown" :
            keysPressed.push(e.keyCode);
            break;
        case "keyup" :
            var idx = keysPressed.indexOf(e.keyCode);
            if (idx >= 0)
                keysPressed.splice(idx, 1);
            break;
    }
});

$("a.shifty").on("click", function(e) {
    e.preventDefault();
    console.log("Shift Pressed: " + (isKeyPressed(shiftCode) ? "true" : "false"));
});

function isKeyPressed(code) {
    return keysPressed.indexOf(code) >= 0;
}
Run Code Online (Sandbox Code Playgroud)

这是jsfiddle

  • 很酷的解决方案,但需要对keyup进行小修复:while(idx> = 0){keysPressed.splice(idx,1); idx = avpg.keysPressed.indexOf(e.keyCode); 否则,只删除按键的第一次出现.要注意这一点,按住shift几秒钟.数组填充了移位代码,但在密钥上只删除其中一个. (3认同)

bug*_*csb 5

为了检查在用鼠标单击时是否按下了 shiftkey ,单击事件对象中有一个确切的属性:shiftKey(以及 ctrl 和 alt 和元键):https : //www.w3schools.com/jsref/event_shiftkey .asp

所以使用jQuery:

$('#anchor').on('click', function (e) {
    if (e.shiftKey) {
        // your code
    }
});
Run Code Online (Sandbox Code Playgroud)