Ответ 1
$(document).on('keyup keydown', function(e){shifted = e.shiftKey} );
У меня есть якорный тег, который вызывает функцию JavaScript.
С или без JQuery, как определить, нажата ли клавиша смены при нажатии ссылки?
Следующий код НЕ работает, потому что нажатие клавиши запускается только при нажатии "реальной клавиши" (а не клавиши сдвига). (Я надеялся, что это сработает, если бы нажала только клавиша 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} );
Вот key code для каждого нажатия клавиши в 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 по крайней мере свойство "shiftKey" в объекте события скажет вам, если клавиша shift опущена. Он задокументирован в MSDN, но я не пробовал его навсегда, поэтому я не помню, делает ли IE это правильно.
Таким образом, вы должны иметь возможность проверить "shiftKey" на объекте события в вашем обработчике "click".
У меня была аналогичная проблема, пытаясь захватить "shift + click", но поскольку я использовал сторонний элемент управления с обратным вызовом, а не стандартный обработчик click
, у меня не было доступа к объекту события и связанный с ним e.shiftKey
.
В итоге я обработал событие mouse down для записи сдвига, а затем использовал его позже в моем обратном вызове.
var shiftHeld = false;
$('#control').on('mousedown', function (e) { shiftHeld = e.shiftKey });
Отправлено только в том случае, если кто-то другой окажется здесь для поиска решения этой проблемы.
Событие keypress
не запускается всеми браузерами при нажатии shift или ctrl, но, к счастью, событие keydown
равно.
Если вы отключите keypress
с помощью keydown
, вам может быть повезло.
Отличная библиотека JavaScript KeyboardJS обрабатывает все типы нажатий клавиш, включая клавишу SHIFT. Он даже позволяет указывать комбинации клавиш, например, сначала нажимать CTRL + x, а затем a.
KeyboardJS.on('shift', function() { ...handleDown... }, function() { ...handleUp... });
Если вам нужна простая версия, откройте ответ @tonycoupland):
var shiftHeld = false;
$('#control').on('mousedown', function (e) { shiftHeld = e.shiftKey });
Я использовал метод для проверки того, нажата ли какая-либо конкретная клавиша, сохраняя текущие нажатые коды клавиш в массиве:
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;
}
Это отлично работает для меня:
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", вы можете сделать что-то вроде этого, которое отвечает на keydown
на клавише 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
}
}
});