83

我如何识别以下代码中按下了哪些 CtrlShiftAlt

$("#my_id").click(function() {
    if (<left control key is pressed>) { alert("Left Ctrl"); }
    if (<right shift and left alt keys are pressed>) { alert("Right Shift + Left Alt"); }
});
4

10 回答 10

82

嗯,你这不会在所有浏览器中工作,只是 IE 8。微软实现了确定按下哪个(右/左)键的能力。这是一个链接http://msdn.microsoft.com/en-us/library/ms534630(VS.85).aspx

我还发现了这篇关于浏览器中的 keypress、keyup、keydown 事件的精彩文章。 http://unixpapa.com/js/key.html

$('#someelement').bind('click', function(event){ 

    if(event.ctrlKey) {
      if (event.ctrlLeft) {
        console.log('ctrl-left'); 
      }
      else {
        console.log('ctrl-right');
      }
    }
    if(event.altKey) {
      if (event.altLeft) {
        console.log('alt-left'); 
      }
      else {
        console.log('alt-right');
      }
    }
    if(event.shiftKey) {
      if (event.shiftLeft) {
        console.log('shift-left'); 
      }
      else
      {
        console.log('shift-right');
      }
    }
  }); 
于 2010-05-20T21:30:34.853 回答
40
$('#someelement').bind('click', function(event){
   if(event.ctrlKey)
      console.log('ctrl');
   if(event.altKey)
      console.log('alt');
   if(event.shiftKey)
      console.log('shift');

});

我不知道是否可以在单击事件中检查左/右键,但我认为这是不可能的。

于 2010-05-17T07:02:21.423 回答
9

e.originalEvent.location左键返回 1,右键返回 2。因此,您可以检测按下哪个modifier键,如下所示。希望这会帮助你。

var msg = $('#msg');
$(document).keyup(function (e) {
      if (e.keyCode == 16) {
          if (e.originalEvent.location == 1)
              msg.html('Left SHIFT pressed.');
          else
              msg.html('Right SHIFT pressed.');
      } else if (e.keyCode == 17) {
          if (e.originalEvent.location == 1)
              msg.html('Left CTRL pressed.');
          else
              msg.html('Right CTRL pressed.');
      } else if (e.keyCode == 18) {
          if (e.originalEvent.location == 1)
              msg.html('Left ALT pressed.');
          else
              msg.html('Right ALT pressed.');
        
          e.preventDefault(); //because ALT focusout the element
      }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<label>Press modifier key: </label>
<strong id="msg"></strong>

于 2015-12-08T12:51:05.677 回答
8

在大多数情况下ALTCTRL, 和SHIFTkey 布尔值将用于查看是否按下了这些键。例如:

var altKeyPressed = instanceOfMouseEvent.altKey

当被调用时,它将返回 true 或 false。欲了解更多信息,请访问https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/altKey

为了将来参考,还有一个称为metaKey(仅限 NS/firefox),它在按下 meta 键时起作用。

于 2015-12-10T15:00:31.757 回答
2

根据我的评论,这是可能的解决方案。

要检查按下了哪个特定的修饰键,您可以使用 KeyboardEvent Location参见表支持

要支持 IE8,幸运的是您可以使用已经发布的解决方案

现在的解决方法是设置一个全局对象,其中包含有关持有哪些修饰键的相关属性。当然,其他不使用全局对象的方法也是可能的。

在这里,我使用相关的 javascript 侦听器方法捕获事件(jQuery 不支持捕获阶段)。我们捕获事件以处理keydown/keyup事件传播由于某种原因被已在使用的代码停止的情况。

/* global variable used to check modifier keys held */
/* Note: if e.g control left key and control right key are held simultaneously */
/* only first pressed key is handled (default browser behaviour?)*/
window.modifierKeys = (function() {
  /* to handle modifier keys except AltGr which is key shortcut for controlRight + alt */
  var mKeys = {};
  /* to fire keydown event only once per key held*/
  var lastEvent, heldKeys = {};
  // capture event to avoid any event stopped propagation
  document.addEventListener('keydown', function(e) {
    if (lastEvent && lastEvent.which == e.which) {
      return;
    }
    lastEvent = e;
    heldKeys[e.which] = true;
    setModifierKey(e);
  }, true);
  // capture event to avoid any event stopped propagation
  document.addEventListener('keyup', function(e) {
    lastEvent = null;
    delete heldKeys[e.which];
    setModifierKey(e);
  }, true);

  function setModifierKey(e) {
    mKeys.alt = e.altKey;
    mKeys.ctrlLeft = e.ctrlKey && e.location === 1;
    mKeys.ctrlRight = e.ctrlKey && e.location === 2;
    mKeys.shiftLeft = e.shiftKey && e.location === 1;
    mKeys.shiftRight = e.shiftKey && e.location === 2;
  }
  return mKeys;
})();

/* on div click, check for global object */
$('.modifierKey').on('click', function() {
  console.log(modifierKeys);
  /* for demo purpose */
  $('.info').text(function() {
    var txt = [];
    for (var p in modifierKeys) {
      if (modifierKeys[p]) txt.push(p);
    }
    return txt.toString();
  });
})
/* for demo purpose */

.info:not(:empty) {
  border: 1px solid red;
  padding: .1em .5em;
  font-weight: bold;
}
.info:not(:empty):after {
  content: " held";
  font-weight: normal;
 }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div class="modifierKey" tabindex="-1">
  DIV to catch modifier keys on click
</div>
<br>
<span class="info"></span>

作为旁注:

  • ALT GRkey 是CTRL-Right&ALT 键的快捷键
  • 同时按住两个相同的修饰键(例如 Shift-Left 和 Shift-Rigth 键),将导致只处理第一个(看起来像默认浏览器行为,所以无论如何,看起来是对的!)
于 2015-12-06T13:46:35.097 回答
2

只是想我会添加一个适合 2020 年的答案。


您现在也可以使用MouseEvent.getModifierState()它 -截至撰写本文时,大多数浏览器都支持它。

document.addEventListener("click", (evn) => {
  const shift = evn.getModifierState("Shift");
  const ctrl = evn.getModifierState("Control");
  const alt = evn.getModifierState("Alt");

  console.log("Mouse pressed! Modifiers:");
  console.table({shift, ctrl, alt});
});

例子

注意事项:

  • 值得注意的是,此 API不区分左右修饰符。如果你关心这一点,那你就有点不走运了。但我想这只对少数用例很重要。
  • 此 API 的主要优点之一是它支持除shiftctrl和之外的修饰符alt。然而,由于固有的平台差异,不同操作系统的特定行为有些不稳定。在使用它们之前检查这里。
于 2020-05-27T03:02:06.873 回答
1

使用js 热键。它是一个 jQuery 插件。

这是一个测试来显示你在寻找什么。它还向您展示了如何捕获标准的左、右、上、下键和数字键盘(带有数字 2、4、6、8 的那个)! http://afro.systems.googlepages.com/test-static-08.html

于 2010-05-26T18:23:39.077 回答
0

比任何事情都容易:您使用 keydown 事件来检查它是Ctrl(17) 还是Shift(16),然后使用 keyup 事件来检查它是否是Enter(13) 和Ctrl/或Shift在(按下键时)取消之前CtrlShift在任何键上但Enter

于 2014-09-11T07:01:28.357 回答
0

左右键和 & 键无法区分是有一些原因的,CTRL因为SHIFT1. ALTkeyCodes 相同 2. 许多笔记本电脑键盘可能没有两个控制键 参考: 如何判断事件是否来自右 Ctrl 键?

于 2015-12-07T16:45:12.490 回答
0

奇迹般有效!在 Chrome、Firefox、IE 和 Edge 上也是如此;) https://jsfiddle.net/55g5utsk/2/

var a=[];
function keyName(p){
    var cases = {16:'Shift',17:'CTRL',18:'Alt'};
    return cases[p] ? cases[p] : 'KeyCode: '+p;
}
function keyPosition(p){
    var cases = {1:'Left',2:'Right'};
    return cases[p] ? cases[p]+' ' : '';
}
$('input').on('keydown',function(e){
    a.push(keyPosition(e.originalEvent.location)+keyName(e.keyCode));
})
$('input').on('keyup',function(){
    var c='';
    var removeDuplicates = [];
    $.each(a, function(i, el){
        if ($.inArray(el, removeDuplicates) === -1) {
           removeDuplicates.push(el);
           c=c+(el)+' + ';
        }
    });
    a=[];
    alert(c.slice(0, -3))
});

以下是带有点击事件的版本 http://jsfiddle.net/2pL0tzx9/

var a=[];
function keyName(p){
    var cases = {16:'Shift',17:'CTRL',18:'Alt'};
    return cases[p] ? cases[p] : '';
}
function keyPosition(p){
    var cases = {1:'Left',2:'Right'};
    return cases[p] ? cases[p]+' ' : '';
}
$(document).on('keydown',function(e){
    a.push(keyPosition(e.originalEvent.location)+keyName(e.keyCode));
})
$('#my_id').on('click',function(){
    var c='';
    var removeDuplicates = [];
    a =a.filter(function(v){return v!==''});
    $.each(a, function(i, el){
      if ($.inArray(el, removeDuplicates) === -1){
          removeDuplicates.push(el);
          c=c+(el)+' + ';
      }
    });
    if (c) alert(c.slice(0, -3));
    a=[];   
});
于 2015-12-11T22:33:08.333 回答