JQuery або JavaScript: Як визначити, чи натискається клавіша Shift під час клацання гіперпосилання на тег прив'язки?


92

У мене є якірний тег, який викликає функцію JavaScript.

З JQuery чи без нього, як мені визначити, чи не натиснута клавіша Shift під час клацання посилання?

Наступний код НЕ працює, оскільки натискання клавіші спрацьовує, лише якщо натиснута "справжня клавіша" (а не клавіша Shift). (Я сподівався, що це спрацює, якщо натиснути лише одну клавішу 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
}

4
наступний код також не працює, оскільки ви ввели shiftkeyзамість shiftKey:-)
Simon_Weaver

Якщо вам потрібно знати, що, щоб уникнути виклику обробника під час натискання shift+click, використовуйтеfilter-altered-clicks
fregante

Відповіді:


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

21
Це спрацювало для мене, але перервало всі стандартні ярлики, які не включали, shiftоскільки функція повертається false. Мені потрібно було явно return trueдозволити crtl + r, ctrl + s, ctrl + p тощо
John H

4
Тож пропозиція полягає у використанні клавіатури замість натискання клавіші.
rwitzel

Дивно, я отримую лише події клавіатури, ніяких клавіш.
Джеррі

Клавіатура @rwitzel і клавіатура дозволяють відстежувати фактичний стан клавіші Shift, коли вони запускаються для кожної клавіші на клавіатурі. Натискання клавіші не завжди спрацьовує, наприклад, не спрацьовує, коли натискається лише клавіша Shift.
jakubiszon

@Gerry, можливо, на вашій сторінці є якийсь інший обробник подій, який порушує ланцюжок подій. Спершу перевірте порожню / нову сторінку (ту, яка не включає всі ваші сценарії) - вона буде працювати як слід.
jakubiszon

74

Ось код ключа для кожного натискання клавіші в 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");
    }
});

плюс 1 за зусилля, докладені для цієї відповіді
Ian Wise

Використовуйте event.keyзамість цього! Це дасть вам знак безпосередньо, наприклад: "a", "1", "LeftArrow"
Гіболт,

Ще краще у своїй версії VanillaJS:document.addEventListener("keydown", function(e){ console.log(e.which); });
Євген

26

Що стосується подій миші, я знаю, що у Firefox принаймні властивість "shiftKey" в об'єкті події повідомляє, якщо клавіша Shift не працює. Це задокументовано в MSDN, але я не пробував це назавжди, тому не пам’ятаю, чи IE робить це правильно.

Таким чином, ви повинні мати можливість перевірити наявність "shiftKey" на об'єкті події у вашому обробнику "click".


2
Справді. Це траплялося ще в перші часи JavaScript.
bobince

23

У мене була подібна проблема, намагаючись зафіксувати 'shift + click', але оскільки я використовував сторонній елемент керування зі зворотним викликом, а не стандартним clickобробником, я не мав доступу до об'єкта події та пов'язаного з нимe.shiftKey .

Я закінчив обробляти подію миші вниз, щоб записати зрушення, а потім використав її пізніше у своєму зворотному дзвінку.

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

Опубліковано на випадок, якщо хтось інший опиниться тут, шукаючи рішення цієї проблеми.


7

keypressПодія не спрацьовують всі браузери при натисканні кнопки shiftабо ctrl, але , до щастя , подіяkeydown .

Якщо ви перейдіть поза keypressз keydownвами може пощастити.


1
Ну, але проблема в тому, що він точно не знатиме , чи натиснута клавіша перемикання. О, але я думаю, якщо прапорець також встановлений для "keyUp", тоді можна було б виявити, коли "клацання" поставлено в дужках за ключовими подіями.
Пойнті

6

Я використав метод, щоб перевірити, чи натискається якась конкретна клавіша, зберігаючи поточно натиснуті коди клавіш у масиві:

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


3
Класне рішення, але воно потребує незначного виправлення при клавіатурі: while (idx> = 0) {keysPress.splice (idx, 1); idx = avpg.keysPress.indexOf (e.keyCode); } В іншому випадку видаляється лише перша поява натискання клавіші. Щоб це помітити, утримуйте Shift кілька секунд. Масив заповнюється кодами зсуву, але при клавіатурі видаляється лише один з них.
pkExec

4

Відмінна бібліотека 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 });

@downvoters: Будь ласка, залиште коментар, чому ви проти
koppor

3

Для мене це чудово працює:

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

3

Для перевірки, чи натискається клавіша Shift під час клацання мишею , в об’єкті події click є точна властивість : shiftKey (а також для клавіш ctrl та alt та meta): https://www.w3schools.com/jsref/event_shiftkey .asp

Отже, використовуючи jQuery:

$('#anchor').on('click', function (e) {
    if (e.shiftKey) {
        // your code
    }
});

2

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

1

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

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

демо

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.