如何在以下代码中确定按下了哪个 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"); }
});
如何在以下代码中确定按下了哪个 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"); }
});
在所有浏览器中这种方法不起作用,只有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');
}
}
});
$('#someelement').bind('click', function(event){
if(event.ctrlKey)
console.log('ctrl');
if(event.altKey)
console.log('alt');
if(event.shiftKey)
console.log('shift');
});
我不知道在点击事件中是否可能检查左/右键,但我认为这是不可能的。
e.originalEvent.location
返回 1 表示按下左键,返回 2 表示按下右键。因此,您可以像以下示例一样检测哪个 修饰键
被按下。希望这能帮助您。
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>
event.location
或event.keyLocation
,并可能回退到event.ctrlLeft
语法以支持IE OLDTIMER。 - Tokimone.originalEvent.location
在 Chrome 和 Firefox 中都能正常工作。@Mac - Ibrahim Khankeyup
有点奇怪...如果你想知道在 click
中是否按下了 Ctrl
键,你应该使用 keydown
并设置一个标志,然后在点击监听器中检查它。在 keyup
中重置该标志。 - Stijn de Witt在大多数情况下,ALT、CTRL 和 SHIFT 键的布尔值可以用来检测这些键是否被按下。例如:
var altKeyPressed = instanceOfMouseEvent.altKey
metaKey
(仅限NS / firefox)在按下meta键时起作用。现在,您还可以使用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});
});
shift
、ctrl
和alt
以外的其他修饰键。然而,由于固有平台差异,其具体行为在不同操作系统上表现得相当不稳定。在使用它们之前,请查看这里。以下是可能的解决方案,跟进我的评论。
要检查按下哪个特定的修饰键,您可以使用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>
作为附注:
非常好用!而且在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))
});
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=[];
});
有一些原因导致右侧和左侧的CTRL、SHIFT和ALT键不可区分,因为: 1. 键码相同 2. 许多笔记本电脑键盘可能没有两个控制键。 参考资料: 如何判断事件是否来自右Ctrl键?
event.originalEvent.location
。然后,在单击上实现逻辑并不那么困难,只需在keydown / keyup事件上设置一些标志/对象,并在单击时进行检查。问题可能是处理altGr
键,它可能会给出不一致的结果。如果我有时间,我会稍后回答。 - A. Wolff