JQuery, проверьте, нажата ли клавиша со стрелкой, оператор swith

Я настроил функцию нажатия клавиш и хочу делать разные вещи в зависимости от того, нажаты ли клавиши со стрелками влево, вправо, вверх или вниз. Это работает с использованием оператора switch, но я также хотел бы что-то сделать, когда нажата ЛЮБАЯ клавиша со стрелкой, но не могу понять. Мой код:

$(document).keydown(function (e) {

var keyCode = e.keyCode || e.which,
    arrow = {left: 37, up: 38, right: 39, down: 40 },

switch (keyCode) {

    case arrow.left:
        // do something left
    break;

    case arrow.right:
        // do something right
    break;
}       

}); 

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

case arrow:
    // do something for any arrow keys
break;

Простое использование «стрелки регистра», похоже, не работает. Может ли кто-нибудь помочь?

Заранее спасибо!

РЕДАКТИРОВАТЬ: Спасибо за вашу помощь всем. Вот мой окончательный код, для тех, кто ищет:

$(document).keydown(function (e) {

    if (e.which >= 37 && e.which <= 40) {
        $('p.key-notification').fadeOut('slow');
    }

    var keyCode = e.keyCode || e.which,
    arrow = {left: 37, up: 38, right: 39, down: 40 },

    switch (keyCode) {

        case arrow.left:
            // do something left
        break;

        case arrow.right:
            // do something right
        break;
    }       

}); 

person Desmond    schedule 18.07.2012    source источник
comment
Это либо никогда не будет выполняться, либо будет выполняться всегда вместо каждого конкретного блока кода стрелок в операторе switch.   -  person ahren    schedule 18.07.2012


Ответы (3)


Почему это также должно быть в вашем заявлении switch?

Сделайте отдельный оператор if после вашего переключателя:

if (keyCode >= 37 && keyCode <= 40) {
    // run your code here
}
person Joseph Silber    schedule 18.07.2012
comment
Спасибо за это, я использовал это, хотя мне пришлось использовать e.that, чтобы проверить, какая клавиша была нажата, поскольку keyCode не возвращал никакого значения, точно не знаю, почему? - person Desmond; 18.07.2012

Один оператор switch не может сопоставляться с несколькими условиями - у вас может быть провал, но это не оценивает выражение в последующих случаях и не даст желаемого эффекта. Я бы сделал это так:

if (keyCode >= 37 && keyCode <= 40) {
   // do any processing for _any_ arrow key here if it should happen
   // before individual arrow key processing

   switch (keyCode) {

      case arrow.left:
        // do something left
        break;

      case arrow.right:
        // do something right
        break;
   }

   // do any processing for _any_ arrow key here if it should happen
   // after individual key processing
}

Помещение switch внутри оператора if избавляет от его оценки, когда ни один из случаев не совпал бы. (Поэтому очевидно, что если вы позже захотите, чтобы switch обрабатывал другие клавиши, вам нужно будет переместить его из if.)

Если вам нужно сделать что-то подобное для ключей, которые не имеют последовательных кодов клавиш, то, очевидно, вы не можете использовать условие >= && <=, поэтому вы должны сделать что-то вроде этого:

if (keyCode === arrow.left || keyCode === arrow.right
   || keyCode === arrow.up || keyCode === arrow.down) {
person nnnnnn    schedule 18.07.2012

Это должно работать для вас, если я правильно вас понимаю.

Еще один подход, улучшающий читаемость

var  arrow = { left: 37, up: 38, right: 39, down: 40 };

Любой из них

switch (evt.keyCode) {
    case arrow.right:
    case arrow.left:
    case arrow.up:
    case arrow.down:
        // Do something
        break;
}

Один из

switch (evt.keyCode) {
    case arrow.right:
        // Do right
        break;
    case arrow.left:
        // Do left
        break;
    case arrow.up:
        // Do up
        break;
    case arrow.down:
        // Do down
        break;
}
person jwize    schedule 06.05.2014
comment
Спасибо за ваш ответ, это тоже очень аккуратно! - person Desmond; 07.05.2014