Обнаружение нажатий клавиш со стрелками в JavaScript

460

Как определить, когда нажата одна из клавиш со стрелками? Я использовал это, чтобы узнать:

function checkKey(e) {
    var event = window.event ? window.event : e;
    console.log(event.keyCode)
}

Хотя он работал для любой другой клавиши, он не работал для клавиш со стрелками (возможно, потому что браузер должен прокручивать эти клавиши по умолчанию).

mihsathe
источник

Ответы:

735

Клавиши со стрелками только срабатывают onkeydown, а не onkeypress.

Ключевые коды:

  • слева = 37
  • вверх = 38
  • прямо = 39
  • вниз = 40
Марк Кан
источник
15
Некоторые браузеры запускают keypressсобытия для клавиш со стрелками, но вы правы, что keydownвсегда работает для клавиш со стрелками.
Тим Даун
4
Если вы нажмете%, вы также получите ключевой код 37
xorcus
9
@xorcus - Нет, вы получаете 53с keydownсобытием. Вы получаете 37с keypress, что другое дело
Марк Кан
7
Что насчет onkeyup?
1
2
@MrCroft - или тоже послушай onkeyupи останови там событие. Однако на самом деле вы не должны изменять поведение пользовательского интерфейса с помощью Javascript.
Марк Кан
225

На клавише вверх и вниз вызывать функцию. Есть разные коды для каждой клавиши.

document.onkeydown = checkKey;

function checkKey(e) {

    e = e || window.event;

    if (e.keyCode == '38') {
        // up arrow
    }
    else if (e.keyCode == '40') {
        // down arrow
    }
    else if (e.keyCode == '37') {
       // left arrow
    }
    else if (e.keyCode == '39') {
       // right arrow
    }

}
Кетан
источник
Что делает вторая строка?
eshellborn
16
Чтобы уточнить, 'E || window.event 'означает, что если' e 'является определенным значением, оно будет результатом' || ' выражение. Если 'e' не определено, 'window.event' будет результатом '||' выражение. Так что это в основном сокращение для: e = e ? e : window.event; Или:if (typeof(e) === "undefined") { e = window.event; }
Майкл Кэлвин
17
Он должен работать на старых версиях IE (до IE9), где событие не было передано в функцию-обработчик.
Марк Родс
12
Просто отметим, что keyCode - это число, и в идеале его следует использовать ===
alexrogers,
11
@ketan дело в том, что keyCode - это число и должно быть проверено как keyCode === 32, а не keyCode == '32'или keyCode === '32'.
Ненотлеп
98

event.key === "ArrowRight" ...

Более свежее и намного чище: используйте event.key. Нет больше произвольных числовых кодов! Если вы путешествуете или знаете, что все ваши пользователи используют современные браузеры, используйте это!

node.addEventListener('keydown', function(event) {
    const key = event.key; // "ArrowRight", "ArrowLeft", "ArrowUp", or "ArrowDown"
});

Подробная обработка:

switch (event.key) {
    case "ArrowLeft":
        // Left pressed
        break;
    case "ArrowRight":
        // Right pressed
        break;
    case "ArrowUp":
        // Up pressed
        break;
    case "ArrowDown":
        // Down pressed
        break;
}

Вы можете легко расширить это, чтобы проверить "w", "a", "s", "d", или любой другой ключ

Mozilla Docs

Поддерживаемые браузеры

PS event.codeто же самое для стрелок

Gibolt
источник
5
Спасибо за использование keyи нет keyCode, это устарело.
v010дя
8
Примечание от MDN: Internet Explorer, Edge (16 и более ранние версии) и Firefox (36 и более ранние версии) используют «Влево», «Вправо», «Вверх» и «Вниз» вместо «ArrowLeft», «ArrowRight», «ArrowUp» "и" ArrowDown ".
Саймон
95

Возможно, самая краткая формулировка:

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

Демо (спасибо пользователю Ангус Грант): http://jsfiddle.net/angusgrant/E3tE6/

Это должно работать кросс-браузер. Оставьте комментарий, если есть браузер, где он не работает.

Есть другие способы получить код ключа (например, e.charCode и window.event вместо e), но они не должны быть необходимыми. Вы можете попробовать большинство из них на http://www.asquare.net/javascript/tests/KeyCode.html . Обратите внимание, что event.keycode не работает с onkeypress в Firefox, но он работает с onkeydown.

1 ''
источник
3
Я должен был найти определение слова « кратко» , затем я (правдоподобно) предположил, что слово «краткость» было неправильным спряжением; увы, я уступаю: моя забота была опровергаемой .
ashleedawg
20

Используйте keydown, не keypressдля непечатаемых клавиш, таких как клавиши со стрелками:

function checkKey(e) {
    e = e || window.event;
    alert(e.keyCode);
}

document.onkeydown = checkKey;

Лучшая найденная мной справочная информация о событиях в JavaScript (например, обошла штаны в причудливом режиме): http://unixpapa.com/js/key.html

Тим Даун
источник
16

Современный ответ, так как keyCode теперь устарел в пользу ключа :

document.onkeydown = function (e) {
    switch (e.key) {
        case 'ArrowUp':
            // up arrow
            break;
        case 'ArrowDown':
            // down arrow
            break;
        case 'ArrowLeft':
            // left arrow
            break;
        case 'ArrowRight':
            // right arrow
    }
};
Джошуа Фан
источник
12

Я считаю, что самый последний метод будет:

document.addEventListener("keydown", function(event) {
  event.preventDefault();
  const key = event.key; // "ArrowRight", "ArrowLeft", "ArrowUp", or "ArrowDown"
  switch (key) { // change to event.key to key to use the above variable
    case "ArrowLeft":
      // Left pressed
      <do something>
      break;
    case "ArrowRight":
      // Right pressed
      <do something>
      break;
    case "ArrowUp":
      // Up pressed
      <do something>
      break;
    case "ArrowDown":
      // Down pressed
      <do something>
      break;
  }
});

Это предполагает, что разработчик хочет, чтобы код был активным в любом месте страницы, и клиент должен игнорировать любые другие нажатия клавиш. Устранить event.preventDefault (); строка, если нажатия клавиш, включая те, которые перехвачены этим обработчиком, все еще должны быть активными.

lrhorer
источник
9
function checkArrowKeys(e){
    var arrs= ['left', 'up', 'right', 'down'], 
    key= window.event? event.keyCode: e.keyCode;
    if(key && key>36 && key<41) alert(arrs[key-37]);
}
document.onkeydown= checkArrowKeys;
Kennebec
источник
1
Разве не стоит ставить arrsвне функции? Не нужно воссоздавать его каждый звонок
Горе
8

Вот пример реализации:

var targetElement = $0 || document.body;

function getArrowKeyDirection (keyCode) {
  return {
    37: 'left',
    39: 'right',
    38: 'up',
    40: 'down'
  }[keyCode];
}

function isArrowKey (keyCode) {
  return !!getArrowKeyDirection(keyCode);
}

targetElement.addEventListener('keydown', function (event) {
  var direction,
      keyCode = event.keyCode;

  if (isArrowKey(keyCode)) {
    direction = getArrowKeyDirection(keyCode);

    console.log(direction);
  }
});
RobPW
источник
Я получаю $ 0 не определен var targetElement = typeof $0 !== 'undefined' ? $0 : document.body; или просто: var targetElement = document.body;все в порядке
Папо
7

Вот как я это сделал:

var leftKey = 37, upKey = 38, rightKey = 39, downKey = 40;
var keystate;
document.addEventListener("keydown", function (e) {
    keystate[e.keyCode] = true;
});
document.addEventListener("keyup", function (e) {
    delete keystate[e.keyCode];
});

if (keystate[leftKey]) {
//code to be executed when left arrow key is pushed.
}
if (keystate[upKey]) {
//code to be executed when up arrow key is pushed.
}
if (keystate[rightKey]) {
//code to be executed when right arrow key is pushed.
}
if (keystate[downKey]) {
//code to be executed when down arrow key is pushed.
}
OneStig
источник
5

Я смог отловить их с помощью jQuery:

$(document).keypress(function (eventObject) {
    alert(eventObject.keyCode);
});

Пример: http://jsfiddle.net/AjKjU/

Albireo
источник
4
keypressне будет работать с клавишами со стрелками. Вы должны использовать $(document).on('keydown', function() {...})вместо этого
Juribiyan
4

Это рабочий код для Chrome и Firefox

<html>
<head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js"></script>

<script type="text/javascript">

    function leftArrowPressed() {
      alert("leftArrowPressed" );
      window.location = prevUrl  
    }

    function rightArrowPressed() {
      alert("rightArrowPressed" );
      window.location = nextUrl  
    }
    function topArrowPressed() {
      alert("topArrowPressed" );
      window.location = prevUrl  
    }

    function downArrowPressed() {
      alert("downArrowPressed" );
      window.location = nextUrl  
    }

        document.onkeydown = function(evt) {
                        var nextPage = $("#next_page_link")
                        var prevPage = $("#previous_page_link")
                        nextUrl = nextPage.attr("href")
                        prevUrl = prevPage.attr("href")
        evt = evt || window.event;
        switch (evt.keyCode) {
                case 37:
                leftArrowPressed(nextUrl);
                break;

                case 38:
                topArrowPressed(nextUrl);
                break;

                 case 39:
                rightArrowPressed(prevUrl);
                break;

                case 40:
                downArrowPressed(prevUrl);
                break;

        }
    };


</script>
</head>
<body>
<p>
<a id="previous_page_link" href="http://www.latest-tutorial.com">Latest Tutorials</a> 
<a id="next_page_link" href="http://www.zeeshanakhter.com">Zeeshan Akhter</a>
 </p>
</body>
</html>
Зеешан Ахтер
источник
3

Я тоже искал этот ответ, пока не наткнулся на этот пост.

Я нашел другое решение, чтобы узнать код клавиши разных ключей, любезно предоставив мою проблему. Я просто хотел поделиться своим решением.

Просто используйте событие keyup / keydown, чтобы записать значение в консоль / предупреждение, используя то же самое event.keyCode. подобно-

console.log(event.keyCode) 

// or

alert(event.keyCode)

- рупам

Рупам Датта
источник
3

Это короче.

function IsArrows (e) { return (e.keyCode >= 37 && e.keyCode <= 40); }

Андрей Ваганов
источник
2
коротко хорошо:if ([37,38,39,40].indexOf(e.keyCode)!=-1){ console.log('arrow pressed') }
анимация
3

Эта библиотека рулит! https://craig.is/killing/mice

Mousetrap.bind('up up down down left right left right b a enter', function() {
    highlight([21, 22, 23]);
});

Вам нужно нажать последовательность немного быстрее, чтобы выделить код на этой странице.

Фанди Сусанто
источник
2

Повторные ответы, которые вам keydownне нужны keypress.

Предполагая, что вы хотите что-то перемещать непрерывно, пока нажата клавиша, я считаю, что это keydownработает для всех браузеров, кроме Opera. Для Opera keydownтолько срабатывает при первом нажатии. Для размещения Opera используйте:

document.onkeydown = checkKey;
document.onkeypress = checkKey;
function checkKey(e)
{ etc etc
Алан Финнерс
источник
2

Стрелки срабатывают на KeyUp

$(document).on("keyup", "body", function(e) {
 if (e.keyCode == 38) {
    // up arrow
    console.log("up arrow")
  }
  if (e.keyCode == 40) {
      // down arrow
      console.log("down arrow")
  }
  if (e.keyCode == 37) {
    // left arrow
    console.log("lefy arrow")
  }
  if (e.keyCode == 39) {
    // right arrow
    console.log("right arrow")
  }
})

onkeydown позволяет Ctrl, Alt, Shits

onkeyup позволяет вкладку, стрелки вверх, стрелки вниз, стрелки влево, стрелки вниз

batMan007
источник
1

Если вы используете JQuery, то вы также можете сделать это,

 $(document).on("keydown", '.class_name', function (event) {
    if (event.keyCode == 37) {
        console.log('left arrow pressed');
    }
    if (event.keyCode == 38) {
        console.log('up arrow pressed');
    }
    if (event.keyCode == 39) {
        console.log('right arrow pressed');
    }
    if (event.keyCode == 40) {
        console.log('down arrow pressed');
    }
 });
Калян Хальдер Рааз
источник
0

контролировать коды клавиш %=37и &=38... и только клавиши со стрелками влево = 37 вверх = 38

function IsArrows (e) {
   return ( !evt.shiftKey && (e.keyCode >= 37 && e.keyCode <= 40)); 
}
Ювер Паредес
источник
0

Если вы хотите обнаруживать нажатия клавиш со стрелками, но не нуждаетесь в конкретном Javascript

function checkKey(e) {
   if (e.keyCode !== 38 || e.keyCode !== 40 || e.keyCode !== 37 || e.keyCode !== 39){
    // do something
   };
}
KitKit
источник
0

С ключом и ES6.

Это дает вам отдельную функцию для каждой клавиши со стрелкой без использования переключателя, а также работает с 2,4,6,8 клавишами в цифровой клавиатуре, когда NumLockона включена .

const element = document.querySelector("textarea"),
  ArrowRight = k => {
    console.log(k);
  },
  ArrowLeft = k => {
    console.log(k);
  },
  ArrowUp = k => {
    console.log(k);
  },
  ArrowDown = k => {
    console.log(k);
  },
  handler = {
    ArrowRight,
    ArrowLeft,
    ArrowUp,
    ArrowDown
  };

element.addEventListener("keydown", e => {
  const k = e.key;

  if (handler.hasOwnProperty(k)) {
    handler[k](k);
  }
});
<p>Click the textarea then try the arrows</p>
<textarea></textarea>

вольт
источник