JQuery或JavaScript:如何确定在按住锚标签超链接时是否按住Shift键?

我有一个调用JavaScript函数的锚标签。

无论有没有JQuery,我如何确定链接被点击时shift键是否closures?

下面的代码不起作用,因为如果按下“真正的按键”(而不是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 } 
  $(document).on('keyup keydown', function(e){shifted = e.shiftKey} ); 

这里是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 

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

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

对于鼠标事件,我知道在Firefox中至less事件对象的“shiftKey”属性会告诉你shift键是否closures。 它logging在MSDN,但我没有永远试过它,所以我不记得IE浏览器是否正确。

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

我有一个类似的问题,试图捕捉一个'shift + click',但由于我使用的是第三方控件的callback,而不是标准的click处理程序,我没有访问事件对象及其关联的e.shiftKey

最后,我处理了鼠标放下事件来logging移位,然后在callback中使用它。

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

张贴只是为了防止别人最终在这里寻找解决这个问题的方法。

当你点击shift或者ctrl时keydown事件不会被所有的浏览器触发,幸运的是keydown事件是 。

如果你用keydown keypress ,你可能会有更好的运气。

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

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

这是jsfiddle

优秀的JavaScript库KeyboardJS处理所有types的按键,包括SHIFT键。 它甚至允许指定组合键,例如先按下CTRL + x然后按a。

 KeyboardJS.on('shift', function() { ...handleDown... }, function() { ...handleUp... }); 

如果你想要一个简单的版本,请通过@tonycoupland来回答 ):

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

这对我很好:

 function listenForShiftKey(e){ var evt = e || window.event; if (evt.shiftKey) { shiftKeyDown = true; } else { shiftKeyDown = false; } } 

一个更加模块化的方法加上把this范围保持在监听器中的能力:

 var checkShift = function(fn, self) { return function(event) { if (event.shiftKey) { fn.call(self, event); } return true; }; }; $(document).on('keydown', checkShift(this.enterMode, this)); 
 var shiftDown = false; this.onkeydown = function(evt){ var evt2 = evt || window.event; var keyCode = evt2.keyCode || evt2.which; if(keyCode==16)shiftDown = true; } this.onkeyup = function(){ shiftDown = false; } 

演示

如果任何人想要检测给定的键并需要知道“修饰符”(如在Java中调用)的状态,即Shift,Alt和Control键,则可以执行类似这样的操作,该键响应键F9上的按键,但前提是当前没有按下Shift,Alt或Control键。

 jqMyDiv.on( 'keydown', function( e ){ if( ! e.shiftKey && ! e.altKey && ! e.ctrlKey ){ console.log( e ); if( e.originalEvent.code === 'F9' ){ // do something } } });