Проверьте клавиши Ctrl/Shift/Alt на событии 'click'
Как я могу определить , какие клавиши 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"); }
});
Ответы
Ответ 1
Хорошо, что вы не будете работать во всех браузерах только в IE 8. Microsoft реализовала возможность определить, какая клавиша (правая/левая) была нажата. Вот ссылка http://msdn.microsoft.com/en-us/library/ms534630(VS.85).aspx
Я также нашел эту статью о проблеме нажатия клавиш, 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');
}
}
});
Ответ 2
$('#someelement').bind('click', function(event){
if(event.ctrlKey)
console.log('ctrl');
if(event.altKey)
console.log('alt');
if(event.shiftKey)
console.log('shift');
});
Я не знаю, можно ли проверить ключи влево/вправо в событии клика, но я не думаю, что это возможно.
Ответ 3
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>
Ответ 4
В большинстве случаев будут выполняться операции с буферами ALT, CTRL и SHIFT, чтобы увидеть, были ли эти клавиши нажаты. Например:
var altKeyPressed = instanceOfMouseEvent.altKey
При вызове он вернет true или false. Для получения дополнительной информации перейдите в https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/altKey
Для справки в будущем имеется также один под названием metaKey
(только для NS/firefox), который работает, когда нажата мета-клавиша.
Ответ 5
Используйте js-hotkeys. Это плагин jQuery.
Это тест, чтобы показать, что вы ищете. Он также показывает вам, как записывать левый, правый, верхний и нижний клавиши, стандартные и цифры с цифровой клавиатуры (с номерами 2,4,6,8)!
http://afro.systems.googlepages.com/test-static-08.html
Ответ 6
Следуя моему комментарию, это возможное решение.
Чтобы проверить, какая конкретная клавиша-модификатор нажата, вы можете использовать Местоположение клавиатуры ( см. таблицу поддержки)
Для поддержки 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>
Ответ 7
Легче всего: вы используете событие keydown, чтобы проверить, если оно Ctrl (17) или Shift (16), вы затем используете событие keyup, чтобы проверить, не Enter (13) и Ctrl или Shift нажмите прежде (клавиша вниз)
отмените Ctrl или Shift на любой клавиатуре, но Enter
Ответ 8
Есть несколько причин, по которым ключи справа и слева CTRL, SHIFT и ALT не различаются, потому что
1. keyCodes одинаковы
2. У многих клавиатур ноутбука могут не быть двух клавиш управления
Взял ссылку:
Как узнать, произошло ли событие из правой клавиши Ctrl?
Ответ 9
Работает как шарм! и в 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))
});
Следующая версия с событием click 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=[];
});