Обв’язування клавіш зі стрілками в JS / jQuery


418

Як перейти до прив'язки функції до лівої та правої клавіш зі стрілками у Javascript та / або jQuery? Я переглянув плагін js-hotkey для jQuery (завершує вбудовану функцію прив'язки, щоб додати аргумент для розпізнавання конкретних ключів), але, схоже, він не підтримує клавіші зі стрілками.


Відповіді:


541
document.onkeydown = function(e) {
    switch(e.which) {
        case 37: // left
        break;

        case 38: // up
        break;

        case 39: // right
        break;

        case 40: // down
        break;

        default: return; // exit this handler for other keys
    }
    e.preventDefault(); // prevent the default action (scroll / move caret)
};

Якщо вам потрібно підтримати IE8, запустіть орган функції як e = e || window.event; switch(e.which || e.keyCode) {.


(відредагувати 2020 р.)
Зауважте, що KeyboardEvent.whichтепер застаріле. Дивіться цей приклад, використовуючиKeyboardEvent.key сучасне рішення для виявлення клавіш зі стрілками.


28
На сьогодні найкраща відповідь. Використання e.whichяк JQuery рекомендує для крос-браузер, використовує e.preventDefault()замість return false( return falseна тригерах через обробник подій JQuery як e.preventDefault()і e.stopPropagation(), другий з яких буде викликати якісь - або пізніше додані події на провал , тому що подія не буде поширюватися на них), а також на кінець перемикача повернеться без виклику, e.preventDefault()якщо це будь-яка інша клавіша, ніж шукана, щоб не перешкоджати використанню інших клавіш, і замість цього $.ui.keyCode.DOWNвона порівнюється з цифрами (МНОГО швидше).
Jimbo Jonny

2
Натан: схоже, що не всі клавішні коди відповідають браузерам, але клавіші зі стрілками є деякими з тих, що є. Дивіться тут: stackoverflow.com/questions/5603195 / ...
Sygmoral

1
@MichaelScheper - 1) змінні! = Константи, незалежно від того, призначені вони для зміни чи ні ... Двигун все ще повинен ставитися до них як до змін, поки константи ES6 не будуть достатньо всюдисущими, що jQuery може використовувати константи 2) числа не є дійсно магічні цифри, коли поруч з ними є коментар, який точно розповідає, що вони є, і 3) ... продовження
Jimbo Jonny

2
... 3) під час доступу $.ui.keyCode.DOWNви шукаєте $у вашому лексичному просторі, не знаходячи його, піднімаючи рівень ... шукаючи $, повторюйте до загального масштабу, знайдіть його у глобальному window, доступ $у вікні, доступ uiна window.$, доступ keyCodeна window.$.ui, доступ DOWNна window.$.ui.keyCodeдістатися до примітивного значення , яке ви хочете порівняти, а потім зробити ваші фактичне порівняння. Незалежно від того, чи важлива ця швидкість для вас, це особисте рішення, я просто схиляюсь уникати 4 рівнів доступу, коли є ситуація, коли я можу так само легко написати / коментувати примітив.
Джимбо Джоні

1
@NathanArthur Тут я знайшов два хороших онлайн-інструменти для тестування клавішних клавіш клавіатури: keycode.info asquare.net/javascript/tests/KeyCode.html unixpapa.com/js/key.html
Ріккардо Вольпе

451
$(document).keydown(function(e){
    if (e.which == 37) { 
       alert("left pressed");
       return false;
    }
});

Коди символів:

37 - зліва

38 - вгору

39 - справа

40 - вниз


4
Чи є якась мета для повернення?
Alex S

19
Він зупиняє будь-які подальші події клавіші, які потрапляють.
s_hewitt

9
Shadow: ні, він означає, що це зупиняє події клавіатури від запуску на інші елементи DOM
JasonWoof

3
Крім 39, це теж апостроф, чи не так?
Пол Д. Уейт

25
Під час використання jQuery використовуйте, e.whichа не e.keyCodeдля більшої підтримки браузера. Дивіться мій коментар нижче.
Сигморал

108

Ви можете використовувати keyCode клавіш зі стрілками (37, 38, 39 та 40 вліво, вгору, вправо і вниз):

$('.selector').keydown(function (e) {
  var arrow = { left: 37, up: 38, right: 39, down: 40 };

  switch (e.which) {
    case arrow.left:
      //..
      break;
    case arrow.up:
      //..
      break;
    case arrow.right:
      //..
      break;
    case arrow.down:
      //..
      break;
  }
});

Перевірте наведений вище приклад тут .


1
Я не впевнений у вашому використанні || Оператор у рядку 2. Чи не є значенням, відмінним від нуля чи ненульовою реалізацією, та не гарантується? Я б використовував щось більше, як: var keyCode = (e.keyCode? E.keyCode: e.which); +1 для використання об’єкта зі стрілкою, щоб надати випадкам імена, які можна прочитати.
Mnebuerquo

6
Якщо ви використовуєте jQuery, вам не потрібно тестувати, наприклад: The event.which property normalizes event.keyCode and event.charCode- api.jquery.com/event.which
JCM

Я намагаюся поставити ключового слухача подій на стіл, але це не вийшло. Чи є обмежена кількість типів селекторів, які підтримують ключових слухачів подій?
Арман Біматов

23

Це трохи пізно, але HotKeys має дуже велику помилку, яка спричиняє події виконуватись декілька разів, якщо ви приєднаєте до елемента кілька гарячих клавіш. Просто використовуйте звичайний jQuery.

$(element).keydown(function(ev) {
    if(ev.which == $.ui.keyCode.DOWN) {
        // your code
        ev.preventDefault();
    }
});

2
+1 для використання об’єкта ключа коду ui. Набагато простіше зрозуміти, ніж 37, 38, 39 або 40. Не впевнений, чому у верхній відповіді використовується e.keyCode, коли в документації jQuery прямо вказано використовувати e.which для обліку відмінностей у браузері. Сподіваємось, ця відповідь отримає більше визнання за те, що правильно це зробити.
Ні

2
Використання $ .ui.keyCode.DOWN під час кожного натискання клавіші набагато повільніше, ніж використання числа. Просто додайте коментар, якщо вас турбує чіткість, тим більше, що його потрібно запускати кожного разу, коли натискається будь-яка клавіша.
Jimbo Jonny

16

Я просто поєднав найкращі шматочки з інших відповідей:

$(document).keydown(function(e){
    switch(e.which) {
        case $.ui.keyCode.LEFT:
        // your code here
        break;

        case $.ui.keyCode.UP:
        // your code here
        break;

        case $.ui.keyCode.RIGHT:
        // your code here
        break;

        case $.ui.keyCode.DOWN:
        // your code here
        break;

        default: return; // allow other keys to be handled
    }

    // prevent default action (eg. page moving up/down)
    // but consider accessibility (eg. user may want to use keys to choose a radio button)
    e.preventDefault();
});

1
Звідки походить "ui"? Отримання "TypeError: $ .ui не визначено" EDIT - мені не вистачало інтерфейсу JQuery. Здобув завантаження - більше помилок немає.
кодер

3
Він, мабуть, також використовує інтерфейс jQuery, який повинен мати цей перелік. Я б не включав інтерфейс jQuery тільки для цього, btw.
Джетро Ларсон

14

Ви можете використовувати KeyboardJS. Я написав бібліотеку для завдань саме так.

KeyboardJS.on('up', function() { console.log('up'); });
KeyboardJS.on('down', function() { console.log('down'); });
KeyboardJS.on('left', function() { console.log('right'); });
KeyboardJS.on('right', function() { console.log('left'); });

Отримайте тут бібліотеку => http://robertwhurst.github.com/KeyboardJS/


14

Непересічне рішення з використанням простого Javascript (завдяки Sygmoral за запропоновані вдосконалення):

document.onkeydown = function(e) {
    switch (e.keyCode) {
        case 37:
            alert('left');
            break;
        case 39:
            alert('right');
            break;
    }
};

Також дивіться https://stackoverflow.com/a/17929007/1397061 .


Напевно, також варто прив’язатись черезdocument.addEventListener('keydown', myFunction);
nathanbirrell

9

Ви впевнені, що jQuery.HotKeys не підтримує клавіші зі стрілками? Я переплутався з їх демонстрацією раніше і спостерігав, як працювали ліворуч, праворуч, вгору та вниз, коли я тестував його в IE7, Firefox 3.5.2 та Google Chrome 2.0.172 ...

EDIT : Схоже, jquery.hotkeys було переміщено до Github: https://github.com/jeresig/jquery.hotkeys


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

5

Замість використання, return false;як у наведених вище прикладах, ви можете використовувати те, e.preventDefault();що робить те саме, але простіше зрозуміти та прочитати.


4
return false;і e.preventDefault();зовсім не однакові. Дивіться stackoverflow.com/a/1357151/607874
Хосе Руй Сантос

4

Приклад чистого js, що йде вправо або вліво

        window.addEventListener('keydown', function (e) {
            // go to the right
            if (e.keyCode == 39) {

            }
            // go to the left
            if (e.keyCode == 37) {

            }
        });

3

Ви можете використовувати jQuery прив'язку:

$(window).bind('keydown', function(e){
    if (e.keyCode == 37) {
        console.log('left');
    } else if (e.keyCode == 38) {
        console.log('up');
    } else if (e.keyCode == 39) {
        console.log('right');
    } else if (e.keyCode == 40) {
        console.log('down');
    }
});

2

Ви можете перевірити, arrow keyчи натиснуто:

$(document).keydown(function(e){
    if (e.keyCode > 36 && e.keyCode < 41) { 
       alert( "arrowkey pressed" );
       return false;
    }
});

0

запобігти стрілка доступна лише для будь-якого іншого об'єкта SELECT, ну насправді я не перевіряв інший об'єкт LOL. але він може зупинити подію зі стрілкою на сторінці та тип введення.

Я вже намагаюся блокувати стрілку вліво і вправо, щоб змінити значення об'єкта SELECT, використовуючи "e.preventDefault ()" або "повернути помилку" на подію "kepress", "keydown" та "keyup", але вона все одно змінює значення об'єкта. але подія все ще говорить вам, що стрілка була натиснута.


0

Надійна бібліотека Javascript для фіксації вводу клавіатури та введених комбінацій клавіш. Він не має залежностей.

http://jaywcjlove.github.io/hotkeys/

hotkeys('right,left,up,down', function(e, handler){
    switch(handler.key){
        case "right":console.log('right');break
        case "left":console.log('left');break
        case "up":console.log('up');break
        case "down":console.log('down');break
    }
});

0

Я прийшов сюди, шукаючи простий спосіб дозволити користувачеві, орієнтуючись на вхід, використовувати клавіші зі стрілками для позначення +1 або -1 числового вводу. Я ніколи не знайшов належної відповіді, але зробив наступний код, який, здається, працює чудово - роблячи цей веб-сайт зараз.

$("input").bind('keydown', function (e) {
    if(e.keyCode == 40 && $.isNumeric($(this).val()) ) {
        $(this).val(parseFloat($(this).val())-1.0);
    } else if(e.keyCode == 38  && $.isNumeric($(this).val()) ) { 
        $(this).val(parseFloat($(this).val())+1.0);
    }
}); 

-1

З кавою та Jquery

  $(document).on 'keydown', (e) ->
    switch e.which
      when 37 then console.log('left key')
      when 38 then console.log('up key')
      when 39 then console.log('right key')
      when 40 then console.log('down key')
    e.preventDefault()
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.