Подтвердить что ты не робот

JQuery или JavaScript: как определить, нажата ли клавиша смены при нажатии гиперссылки на якорный тег?

У меня есть якорный тег, который вызывает функцию 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
}
4b9b3361

Ответ 1

    $(document).on('keyup keydown', function(e){shifted = e.shiftKey} );

Ответ 2

Вот 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");
    }
});

Ответ 3

Для событий мыши я знаю, что в Firefox по крайней мере свойство "shiftKey" в объекте события скажет вам, если клавиша shift опущена. Он задокументирован в MSDN, но я не пробовал его навсегда, поэтому я не помню, делает ли IE это правильно.

Таким образом, вы должны иметь возможность проверить "shiftKey" на объекте события в вашем обработчике "click".

Ответ 4

У меня была аналогичная проблема, пытаясь захватить "shift + click", но поскольку я использовал сторонний элемент управления с обратным вызовом, а не стандартный обработчик click, у меня не было доступа к объекту события и связанный с ним e.shiftKey.

В итоге я обработал событие mouse down для записи сдвига, а затем использовал его позже в моем обратном вызове.

    var shiftHeld = false;
    $('#control').on('mousedown', function (e) { shiftHeld = e.shiftKey });

Отправлено только в том случае, если кто-то другой окажется здесь для поиска решения этой проблемы.

Ответ 5

Событие keypress не запускается всеми браузерами при нажатии shift или ctrl, но, к счастью, событие keydown равно.

Если вы отключите keypress с помощью keydown, вам может быть повезло.

Ответ 6

Отличная библиотека 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 });

Ответ 7

Я использовал метод для проверки того, нажата ли какая-либо конкретная клавиша, сохраняя текущие нажатые коды клавиш в массиве:

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;
}

Вот jsfiddle

Ответ 8

Это отлично работает для меня:

function listenForShiftKey(e){
    var evt = e || window.event;
    if (evt.shiftKey) {
      shiftKeyDown = true;
    } else {
      shiftKeyDown = false;
    }
}

Ответ 9

Более модульный подход плюс возможность сохранить область 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));

Ответ 10

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;
}

демо

Ответ 11

Если кто-то хочет обнаружить данный ключ и должен знать статус "модификаторов" (как они вызывают в 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 
        }
    }
});