Связывание клавиш со стрелками в JS / jQuery

389

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

Теги:
keyboard
key-bindings

16 ответов

485
Лучший ответ
$(document).keydown(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)
});

Поместите свой код для клавиш со стрелками между соответствующими строками case и break.

e.which нормализуется jQuery, поэтому он работает во всех браузерах. Для чистого javascript-подхода замените первые две строки:

document.onkeydown = function(e) {
    e = e || window.event;
    switch(e.which || e.keyCode) {


(изменить 2017)
Если вам кажется, вы можете использовать e.key вместо e.which или e.keyCode. e.key становится рекомендуемым стандартом, позволяющим вам проверять строки: 'ArrowLeft', 'ArrowUp', 'ArrowRight', 'ArrowDown'. Новые браузеры поддерживают его изначально, здесь проверьте.

  • 28
    Безусловно лучший ответ. Использует e.which jQuery рекомендует для кросс-браузера, использует e.preventDefault() вместо return false ( return false в обработчике события jQuery вызывает как e.preventDefault() и e.stopPropagation() , второй из которых происходит вызывать сбой любых последующих добавленных событий, так как событие не будет распространяться на них), и в конце коммутатора будет возвращаться без вызова e.preventDefault() если любой другой ключ, кроме e.preventDefault() не мешает другое использование ключа, и вместо $.ui.keyCode.DOWN он сравнивается с числами (НАМНОГО быстрее).
  • 0
    Где вы найдете эти коды клавиш?
Показать ещё 7 комментариев
462
$(document).keydown(function(e){
    if (e.keyCode == 37) { 
       alert( "left pressed" );
       return false;
    }
});

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

37 - левый

38 - вверх

39 - правый

40 - вниз

  • 4
    Есть ли цель для возвращения?
  • 18
    Он останавливает любые дальнейшие события нажатия клавиш.
Показать ещё 10 комментариев
99

Вы можете использовать keyCode клавиш со стрелками (37, 38, 39 и 40 для левого, правого и правого):

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

  switch (keyCode) {
    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 за использование объекта стрелки, чтобы дать читаемым названиям дел.
  • 6
    Если вы используете jQuery, вам не нужно проверять e.which: The event.which property normalizes event.keyCode and event.charCode - api.jquery.com/event.which
Показать ещё 1 комментарий
23

Это немного поздно, но HotKeys имеет очень серьезную ошибку, которая заставляет события выполняться несколько раз, если вы присоединяете к одному элементу более одной горячей клавиши. Просто используйте простой jQuery.

$(element).keydown(function(ev) {
    if(ev.which == $.ui.keyCode.DOWN) {
        // your code
        ev.preventDefault();
    }
});
  • 2
    +1 за использование объекта ключевого кода пользовательского интерфейса. Гораздо проще понять, чем 37, 38, 39 или 40. Не уверен, почему верхний ответ использует e.keyCode, когда в документации jQuery прямо указано использование e.which для учета различий в браузере. Надеюсь, этот ответ получит больше признания за то, что сделал это правильно.
  • 2
    Использование $ .ui.keyCode.DOWN при каждом нажатии клавиши НАМНОГО медленнее, чем использование числа. Просто добавьте комментарий, если вас беспокоит ясность, тем более что он должен запускаться при каждом нажатии любой клавиши.
15

Я просто собрал лучшие бит из других ответов:

$(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. Получил, что загружен - больше нет ошибки.
  • 2
    Он, очевидно, также использует jQuery UI, который должен иметь это перечисление. Кстати, я бы не включил 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/

9

Тесное решение с использованием простого Javascript (спасибо Sygmoral за предлагаемые улучшения):

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

Также см. https://stackoverflow.com/questions/5597060/detecting-arrow-key-presses-in-javascript.

  • 0
    Вероятно, также стоит связать через 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

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

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

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

Пример чистых js при переходе вправо или влево

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

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

            }
        });
2

Вы можете проверить, нажата ли кнопка arrow key:

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

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

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

0

С кофе и 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()

Ещё вопросы

Сообщество Overcoder
Наверх
Меню