Detectando pressionamentos de teclas de seta em JavaScript

459

Como detecto quando uma das teclas de seta é pressionada? Eu usei isso para descobrir:

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

Embora funcionasse para todas as outras teclas, não funcionava para as teclas de seta (talvez porque o navegador deva rolar essas teclas por padrão).

mihsathe
fonte

Respostas:

734

As teclas de seta são acionadas apenas por onkeydown, não onkeypress.

Os códigos de chave são:

  • esquerda = 37
  • up = 38
  • right = 39
  • down = 40
Mark Kahn
fonte
15
Alguns navegadores acionam keypresseventos para teclas de seta, mas você está certo que keydownsempre funciona para teclas de seta.
Tim Baixo
4
Se você pressionar%, você também obterá o código 37
xorcus 17/10
9
@xorcus - Não, você recebe 53um keydownevento. Você começa 37com keypress, que é uma coisa diferente
Mark Kahn
7
E quanto a onkeyup?
precisa saber é o seguinte
2
@MCrCroft - ou também ouça onkeyupe pare o evento lá. Realisticamente, você não deve modificar o comportamento da interface do usuário com Javascript.
Mark Kahn
225

Função de chamada para cima e para baixo. Existem códigos diferentes para cada tecla.

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
    }

}
cetana
fonte
O que a segunda linha faz?
eshellborn
16
Para esclarecer, 'e || window.event 'significa que, se' e 'for um valor definido, será o resultado de' || ' expressão. Se 'e' não estiver definido, 'window.event' será o resultado de '||' expressão. Portanto, é basicamente uma abreviação de: e = e ? e : window.event; Ou:if (typeof(e) === "undefined") { e = window.event; }
Michael Calvin
17
É para fazê-lo funcionar em versões antigas do IE (anteriores ao IE9), nas quais o evento não foi passado para a função de manipulador.
Mark Rhodes
12
Só para nota keyCode é um número e === deveriam idealmente ser utilizados
alexrogers
11
@ketan o ponto foi que keyCode é um número e deve ser verificado como keyCode === 32, não keyCode == '32'ou keyCode === '32'.
Nenotlep
98

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

Mais recente e muito mais limpo: use event.key. Chega de códigos numéricos arbitrários! Se você está transpilando ou sabe que todos os usuários estão em navegadores modernos, use isso!

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

Manuseio Detalhado:

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

Você pode estendê-lo facilmente para verificar "w", "a", "s", "d"ou qualquer outra chave

Documentos do Mozilla

Navegadores suportados

PS event.codeé o mesmo para setas

Gibolt
fonte
5
Obrigado por usar keye não keyCode, isso foi preterido.
v010dya
8
Nota do MDN: Internet Explorer, Edge (16 e versões anteriores) e Firefox (36 e versões anteriores) usam "Left", "Right", "Up" e "Down" em vez de "ArrowLeft", "ArrowRight" e "ArrowUp" "e" ArrowDown ".
Simon
95

Possivelmente a formulação mais concisa:

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;
    }
};

Demonstração (graças ao usuário Angus Grant): http://jsfiddle.net/angusgrant/E3tE6/

Isso deve funcionar em vários navegadores. Deixe um comentário se houver um navegador em que ele não funcione.

Existem outras maneiras de obter o código da chave (e.which, e.charCode e window.event em vez de e), mas elas não devem ser necessárias. Você pode experimentar a maioria deles em http://www.asquare.net/javascript/tests/KeyCode.html . Observe que event.keycode não funciona com onkeypress no Firefox, mas funciona com onkeydown.

1 ''
fonte
3
Eu tive que procurar a definição de conciso , então (alegremente) postulei que o concerto era uma conjugação imprópria; infelizmente, eu admito: minha solicitude foi refutável .
ashleedawg
20

Use keydown, não keypresspara teclas não imprimíveis, como teclas de seta:

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

document.onkeydown = checkKey;

A melhor referência de evento-chave do JavaScript que encontrei (superando o modo quirks, por exemplo) está aqui: http://unixpapa.com/js/key.html

Tim Down
fonte
16

Resposta moderna, pois keyCode agora está obsoleto em favor da chave :

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
    }
};
Joshua Fan
fonte
12

Eu acredito que o método mais recente seria:

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;
  }
});

Isso pressupõe que o desenvolvedor deseja que o código esteja ativo em qualquer lugar da página e que o cliente deve ignorar qualquer outra tecla pressionada. Eliminar o event.preventDefault (); line se as teclas pressionadas, incluindo aquelas capturadas por esse manipulador, ainda devem estar ativas.

lrhorer
fonte
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
fonte
1
Não vale a pena colocar arrsfora da função? Não há necessidade de recriá-lo cada chamada
Grief
8

Aqui está um exemplo de implementação:

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
fonte
Eu estou recebendo $ 0 não está definido var targetElement = typeof $0 !== 'undefined' ? $0 : document.body; ou apenas: var targetElement = document.body;está ok #
1264
7

Aqui está como eu fiz isso:

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
fonte
5

Consegui prendê-los com jQuery:

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

Um exemplo: http://jsfiddle.net/AjKjU/

Albireo
fonte
4
keypressnão funcionará com as teclas de seta. Você deve usar em $(document).on('keydown', function() {...})vez disso
Juribiyan
4

Esse é o código de trabalho para chrome e 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>
Zeeshan Akhter
fonte
3

Eu também estava procurando por essa resposta até encontrar este post.

Encontrei outra solução para conhecer o código das chaves diferentes, cortesia do meu problema. Eu só queria compartilhar minha solução.

Basta usar o evento keyup / keydown para escrever o valor no console / alertar o mesmo usando event.keyCode. gostar-

console.log(event.keyCode) 

// or

alert(event.keyCode)

- rupam

Rupam Datta
fonte
3

Isso é mais curto.

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

Andrey Vaganov
fonte
2
curta é boa:if ([37,38,39,40].indexOf(e.keyCode)!=-1){ console.log('arrow pressed') }
animaacija 12/07/2015
3

Essa biblioteca é demais! https://craig.is/killing/mice

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

Você precisa pressionar a sequência um pouco rápido para destacar o código nessa página.

Fandi Susanto
fonte
2

Re respostas que você keydownnão precisa keypress.

Supondo que você queira mover algo continuamente enquanto a tecla é pressionada, acho que keydownfunciona para todos os navegadores, exceto o Opera. Para o Opera, keydownsomente dispara na 1ª pressão. Para acomodar o Opera, use:

document.onkeydown = checkKey;
document.onkeypress = checkKey;
function checkKey(e)
{ etc etc
Alan Finners
fonte
2

As teclas de seta são acionadas no 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 permite ctrl, alt, merdas

onkeyup permite tabulação, setas para cima, setas para baixo, setas para a esquerda, setas para baixo

batMan007
fonte
1

Se você usa jquery, também pode fazer assim,

 $(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');
    }
 });
Kalyan Halder Raaz
fonte
0

controlar os códigos das teclas %=37e &=38... e apenas as teclas de seta restantes = 37 para cima = 38

function IsArrows (e) {
   return ( !evt.shiftKey && (e.keyCode >= 37 && e.keyCode <= 40)); 
}
Juver Paredes
fonte
0

Se você deseja detectar pressionamentos de tecla de seta, mas não precisa de Javascript específico

function checkKey(e) {
   if (e.keyCode !== 38 || e.keyCode !== 40 || e.keyCode !== 37 || e.keyCode !== 39){
    // do something
   };
}
KitKit
fonte
0

Com chave e ES6.

Isso fornece uma função separada para cada tecla de seta sem usar a chave e também funciona com as teclas 2,4,6,8 no teclado numérico quando NumLockestá ativado .

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>

volt
fonte