在“单击”事件上检查 Ctrl / Shift / Alt 键

IT技术 javascript jquery html firefox3.6
2021-02-10 23:50:20

我怎么能确定哪个 Ctrl/ Shift/Alt下面的代码键被按下?

$("#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"); }
});
6个回答

好吧,这不适用于仅 IE 8 的所有浏览器。Microsoft 实现了确定按下哪个(右/左)键的功能。这是一个链接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');
      }
    }
  }); 
米莎·莫罗什科。抱歉,目前还没有办法在 Firefox 中做到这一点。也许它会在未来实现“keyLocation”、“keyIdentifier”或“shiftLeft”......我确实有一个疯狂的建议,但不确定它是否会起作用。我知道 JAVA 小程序能够检测左右击键。如果您可以在小程序中捕获击键,然后将右/左信息传回网站。我什至不能开始告诉你如何做到这一点。但它的一个想法。Flash 可能是 JAVA 小程序的替代品
2021-03-22 23:50:20
同样,您也可以使用Flash Actionscript3 来实现,但我猜您也不想去那里。
2021-03-23 23:50:20
是的,我想你不会。但现在它只是不可能做 uisng JQuery/HTML DOM 和 Firefox 3.6.3
2021-04-03 23:50:20
其他评论之一中的 quirksmode 链接表明它是 IE6+ 而不仅仅是 IE8 ...
2021-04-05 23:50:20
抱歉,我没有提到我对 Firefox 3.6.3 感兴趣。我相应地更新了问题。
2021-04-11 23:50:20
$('#someelement').bind('click', function(event){
   if(event.ctrlKey)
      console.log('ctrl');
   if(event.altKey)
      console.log('alt');
   if(event.shiftKey)
      console.log('shift');

});

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

我认为您必须等待 DOM3 支持才能区分左右。DOM 3 引入了 event.keyLocation ( w3.org/TR/DOM-Level-3-Events/... )。
2021-03-17 23:50:20
Firefox 3.6.3 有可能实现这个吗?
2021-03-27 23:50:20
Shift left 和 right 的键码都是 16。 与 Ctrl (17) 和 alt (18) 相同
2021-04-01 23:50:20
Firefox 中似乎尚未实现那些左/右功能。对于 shift 有一个功能请求,您可以加星标:bugzilla.mozilla.org/show_bug.cgi? id=458433 ctrlLeft 甚至没有错误/功能请求。Quirksmode 页面(尽管缺少任何最近浏览器的信息):quirksmode.org/dom/w3c_events.html#keyprops
2021-04-06 23:50:20

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>

在 Chrome 中使用event.location是唯一对我有用的东西,可以区分左侧键和右侧键。
2021-03-20 23:50:20
e.originalEvent.location在 Chrome 和 Firefox 中为我工作。@苹果电脑
2021-03-21 23:50:20
使用起来似乎很奇怪keyup......如果你想知道Ctrl在 a 期间是否被按下(按住)click,你会想要使用keydown并设置一个标志,然后你可以检查点击侦听器。中的标志重置keyup
2021-03-23 23:50:20
我在 Chrome 中快速浏览了一下,得出的结果与您相同。使用event.locationevent.keyLocation并可能退回到event.ctrlLeftIE OLDTIMER语法。
2021-03-27 23:50:20

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

var altKeyPressed = instanceOfMouseEvent.altKey

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

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

这可能是这里最好的答案。有趣的是它没有赞成票。
2021-03-16 23:50:20
值得注意的是,如果用户使用默认设置的 Linux Mint 18,这个简单的解决方案可能会失败。如果在 Preferences: Windows: Behavior: Special Key to move and resize windows 中找到的 OS 设置设置为 Alt(默认情况下),按住 Alt 将导致click不触发事件,因此,引用该altKey属性的函数永远不会被执行。
2021-03-22 23:50:20

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

要检查按下了哪个特定的修饰键,您可以使用 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 键),只会导致处理第一个(似乎是默认的浏览器行为,所以无论如何,看起来是对的!)