Связывание клавиш со стрелками в 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 более современное решение для обнаружения клавиш со стрелками.

Sygmoral
источник
28
Безусловно лучший ответ. Использует, e.whichкак jQuery рекомендует для кросс-браузер, использует e.preventDefault()вместо return false( return falseв обработчике событий jQuery вызывает оба e.preventDefault()и e.stopPropagation(), и второй, который будет вызывать сбой любых последующих добавленных событий, так как событие не будет распространяться на них), и на конец коммутатора, будет возвращаться без вызова, e.preventDefault()если это какая-то другая клавиша, кроме искомой, которая не мешает другому использованию ключа, и вместо $.ui.keyCode.DOWNэтого сравнивается с числами (НАМНОГО быстрее).
Джимбо Джонни
2
Натан: кажется, что не все коды клавиш совместимы между браузерами, но клавиши со стрелками - некоторые из них. Смотрите здесь: stackoverflow.com/questions/5603195/…
Sygmoral
1
@MichaelScheper - 1) переменные! = Константы, независимо от того, предназначены ли они для изменения или нет ... движку все еще приходится обращаться с ними как с переменными, пока константы ES6 не станут достаточно повсеместными, чтобы jQuery мог использовать константы 2) числа не являются действительно магические числа, когда рядом с ними есть комментарий, рассказывающий точно, что они есть, и 3) ... продолжение
Джимбо Джонни
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
Есть ли цель для возвращения?
Алекс С
19
Он останавливает любые дальнейшие события нажатия клавиш.
s_hewitt
9
Тень: нет, он имеет в виду, что он останавливает событие
нажатия клавиш
3
Кроме 39 тоже апостроф, не правда ли?
Пол Д. Уэйт
25
При использовании jQuery используйте, e.whichа не e.keyCodeдля большей поддержки браузера. Смотрите мой комментарий ниже.
Сигморал
108

Вы можете использовать код клавиши клавиш со стрелками (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;
  }
});

Проверьте приведенный выше пример здесь .

CMS
источник
1
Я не уверен, что вы используете || оператор в строке 2. Разве значение, отличное от нуля или ненулевой реализации, не является гарантированным и не гарантируется? Я хотел бы использовать что-то вроде: var keyCode = (e.keyCode? E.keyCode: e.which); +1 за использование объекта стрелки, чтобы дать читаемым названиям дел.
Mnebuerquo
6
Если вы используете jQuery, вам не нужно проверять e.which: 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();
    }
});
mackstann
источник
2
+1 за использование объекта ключевого кода пользовательского интерфейса. Гораздо проще понять, чем 37, 38, 39 или 40. Не уверен, почему верхний ответ использует e.keyCode, когда в документации jQuery прямо указано использование e.which для учета различий в браузере. Надеюсь, этот ответ получит больше признания за то, что сделал это правильно.
нет
2
Использование $ .ui.keyCode.DOWN при каждом нажатии клавиши НАМНОГО медленнее, чем использование числа. Просто добавьте комментарий, если вас беспокоит ясность, тем более что он должен запускаться при каждом нажатии любой клавиши.
Джимбо Джонни
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 is undefined" РЕДАКТИРОВАТЬ - мне не хватало JQuery UI. Получил, что загружен - больше нет ошибки.
кодер
3
Он, очевидно, также использует пользовательский интерфейс jQuery, который должен иметь это перечисление. Кстати, я бы не включил jQuery UI.
Джетро Ларсон
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 .

1 ''
источник
Вероятно, также стоит document.addEventListener('keydown', myFunction);
связать
9

Вы уверены, что jQuery.HotKeys не поддерживает клавиши со стрелками? Я уже порвал их демо-версию и наблюдал за работой влево, вправо, вверх и вниз, когда тестировал их в IE7, Firefox 3.5.2 и Google Chrome 2.0.172 ...

РЕДАКТИРОВАТЬ : кажется, jquery.hotkeys был перемещен в Github: https://github.com/jeresig/jquery.hotkeys

Pandincus
источник
Я читал, где говорится, что он основан на другой библиотеке, и предположил, что список поддерживаемых ключей все еще применяется.
Алекс С
5

Вместо использования, return false;как в примерах выше, вы можете использовать то, e.preventDefault();что делает то же самое, но легче для понимания и чтения.

Gaetan
источник
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 bind:

$(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;
    }
});
suhailvs
источник
0

предотвратить стрелку, доступную только для любого объекта, кроме SELECT, на самом деле у меня нет тестов на другом объекте LOL. но он может остановить событие стрелки на странице и тип ввода.

я уже пытаюсь заблокировать стрелку влево и вправо, чтобы изменить значение объекта SELECT с помощью «e.preventDefault ()» или «return false» для событий «kepress», «keydown» и «keyup», но оно все еще меняет значение объекта. но событие все еще говорит вам, что стрелка была нажата.

Phoenixs
источник
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()
Филипп
источник