Como detectar a tecla pressionada com JS ou jQuery?

524

Possível duplicado:
qual código de chave para a chave de escape com jQuery

Como detectar a pressão da tecla Escape no IE, Firefox e Chrome? O código abaixo funciona no IE e nos alertas 27, mas no Firefox alerta0

$('body').keypress(function(e){
    alert(e.which);
    if(e.which == 27){
        // Close my modal window
    }
});
Mithun Sreedharan
fonte
1
fazer alguma detecção do navegador primeiro?
ina
7
Acho quirksmode.org sempre confiável para descobrir o que funciona em qual navegador: quirksmode.org/js/keys.html . Lá você pode encontrar isso apenas keyupou keydownem combinação com keyCodeobras em todos os navegadores.
Felix Kling
1
Eu acho que o título desta pergunta deve ser "Como detectar o pressionamento da tecla Escape com o jquery?" Ou as respostas devem estar em javascript nativo ...
Wilt
3
$(document).on("keyup", function (e) {var code = e.keyCode || e.which; alert('key pressed: ' + code);});Saudações do 2014
Kalle H. Väravas 02/02

Respostas:

957

Nota: keyCodeestá ficando com uso obsoletokey .

function keyPress (e) {
    if(e.key === "Escape") {
        // write your logic here.
    }
}

Aqui está o jsfiddle


keyCode está ficando obsoleto

Parece keydowne keyupfunciona, mesmo que keypressnão


$(document).keyup(function(e) {
     if (e.key === "Escape") { // escape key maps to keycode `27`
        // <DO YOUR WORK HERE>
    }
});

Qual código de chave da chave de escape com o jQuery

Jigar Joshi
fonte
11
para desvincular: $ (document) .unbind ("keyup", keyUpFunc);
Plattsy
54
Para desatar, você também pode usar um espaço para nome no evento, $(document).on('keyup.unique_name', ...)e$(document).unbind('keyup.unique_name')
Lachlan McD.
9
Recomenda-se usar e.which (em vez de e.keycode) para verificar qual tecla foi pressionada. jQuery normaliza keycode e charCode (usado em navegadores mais antigos)
DMTintner
1
@DMTintner: sobre o mesmo assunto, veja o comentário deixado por Jordan Brough stackoverflow.com/a/1160109/759452
Adrien Seja
8
Você sempre deve usar ===.
pmandell
211

O keydownevento funcionará bem para o Escape e tem o benefício de permitir que você use keyCodeem todos os navegadores. Além disso, você precisa anexar o ouvinte ao documentinvés do corpo.

Atualização maio de 2016

keyCodeagora está sendo preterido e os navegadores mais modernos oferecem a keypropriedade agora, embora você ainda precise de um suporte decente para o navegador (por enquanto, as versões atuais do Chrome e Safari não são compatíveis).

A atualização de setembro de 2018 evt.key agora é suportada por todos os navegadores modernos.

document.onkeydown = function(evt) {
    evt = evt || window.event;
    var isEscape = false;
    if ("key" in evt) {
        isEscape = (evt.key === "Escape" || evt.key === "Esc");
    } else {
        isEscape = (evt.keyCode === 27);
    }
    if (isEscape) {
        alert("Escape");
    }
};
Click me then press the Escape key

Tim Down
fonte
3
Observe que você também pode adicionar o ouvinte a um <input>elemento e, portanto, ele será acionado apenas quando esse elemento estiver focado.
1937 Mike
1
@Ranmocy: Que tipo de elemento é esse (aquele com ID 'test')? Somente elementos capazes de receber eventos de foco (entradas de formulário, elementos editáveis ​​por conteúdo, elementos com tabindex definido) acionam as principais chaves.
Tim Down
1
Você também pode verificar if (evt.key === 'Escape') {em vez de usar a obsoletakeyCode
Keysox
1
@tobymackenzie: Assim é. Isso não é maravilhoso? Bem-vindo ao admirável mundo novo de desenvolvimento web baseado em padrões.
Tim Down
1
Se você quiser saber se pode usar com segurança .key, consulte caniuse.com/#feat=keyboardevent-key
Jasper de Vries
37

Usando JavaScript, você pode verificar o funcionamento do jsfiddle

document.onkeydown = function(evt) {
    evt = evt || window.event;
    if (evt.keyCode == 27) {
        alert('Esc key pressed.');
    }
};

Usando o jQuery, você pode verificar o funcionamento do jsfiddle

jQuery(document).on('keyup',function(evt) {
    if (evt.keyCode == 27) {
       alert('Esc key pressed.');
    }
});
Subodh Ghulaxe
fonte
17

verifique keyCode&& which& keyup||keydown

$(document).keydown(function(e){
   var code = e.keyCode || e.which;
   alert(code);
});
jAndy
fonte
vejo que isso não está funcionando, jsfiddle.net/GWJVt apenas para a fuga ... parece estranho?
Reigel
$ (document.body) .keypress () não está disparando
Mithun Sreedharan
@ Reigel: na verdade, parece não funcionar corretamente com o pressionamento de tecla. Seja como for, não consigo entender a parte 'estranha'.
Jandy
3
O KeyPress é ativado para as teclas de caracteres (ao contrário do KeyDown e do KeyUp, que também são ativados para as teclas que não são de caracteres) enquanto a tecla é pressionada.
Marta
7

A melhor maneira é fazer funcionar para isso

FUNÇÃO:

$.fn.escape = function (callback) {
    return this.each(function () {
        $(document).on("keydown", this, function (e) {
            var keycode = ((typeof e.keyCode !='undefined' && e.keyCode) ? e.keyCode : e.which);
            if (keycode === 27) {
                callback.call(this, e);
            };
        });
    });
};

EXEMPLO:

$("#my-div").escape(function () {
    alert('Escape!');
})
Ivijan Stefan Stipić
fonte
4
Na verdade, parece que keypressnão dispara na tecla de escape. Pelo menos, não no Chrome em um Mac.
21416
1
Obrigado por esse feedback, fiz uma regra de atualização e alteração. keydowncorrigir o problema.
Ivijan Stefan Stipić
Atualizei sua solução para oferecer suporte ao uso "apenas uma vez". Aqui está um exemplo: jsfiddle.net/oxok5x2p .
dh
6

Abaixo está o código que não apenas desabilita a tecla ESC, mas também verifica a condição em que é pressionada e, dependendo da situação, fará a ação ou não.

Neste exemplo,

e.preventDefault();

desativará a ação de pressionar a tecla ESC.

Você pode fazer algo como ocultar uma div com isso:

document.getElementById('myDivId').style.display = 'none';

Onde a tecla ESC pressionada também é levada em consideração:

(e.target.nodeName=='BODY')

Você pode remover essa parte da condição se quiser aplicar a todos. Ou você pode direcionar INPUT aqui para aplicar esta ação apenas quando o cursor estiver na caixa de entrada.

window.addEventListener('keydown', function(e){
    if((e.key=='Escape'||e.key=='Esc'||e.keyCode==27) && (e.target.nodeName=='BODY')){
        e.preventDefault();
        return false;
    }
}, true);
Tarik
fonte
0

Eu acho que a maneira mais simples é o javascript de baunilha:

document.onkeyup = function(event) {
   if (event.key === 27){
     //do something here
   }
}
Duan Walker
fonte
6
No meu chrome (versão 55.0.2883.95 (64 bits)), recebo Escapecomo event.keye não 27
MosheZada
Deveria ser event.keyCode27.
Jens Törnell