Ouvinte JavaScript, "keypress" não detecta backspace?

141

Eu estou usando um keypressouvinte, por exemplo ..

addEventListener("keypress", function(event){

}

No entanto, isso não parece detectar um backspace que apaga o texto ...

Existe um ouvinte diferente que eu possa usar para detectar isso?

Skizit
fonte

Respostas:

167

Evento KeyPress é invocado apenas para caráter chaves (para impressão), evento KeyDown é gerado para todos, incluindo não imprimível, como Control, Shift, Alt, BackSpace, etc.

ATUALIZAR:

O evento de pressionamento de tecla é acionado quando uma tecla é pressionada e essa tecla normalmente produz um valor de caractere

Referência .

Kris Ivanov
fonte
3
Não é exatamente verdade: muitas chaves não imprimíveis acionam keypresseventos em muitos navegadores. Veja unixpapa.com/js/key.html
Tim Down
Na versão atual do Mozilla, o backspace e tudo são detectados no evento de pressionamento de tecla.
Iniravpatel # 22/17
70

Tente em keydownvez de keypress.

Os eventos de teclado ocorrem nesta ordem: keydown, keyup,keypress

O problema do backspace provavelmente é que o navegador voltará a navegar keyupe, portanto, sua página não verá o keypressevento.

Tomalak
fonte
Eu não examinei os padrões, mas a ordem dos eventos (pelo menos no Firefox 37) parece ser keydown keypress keyup. unixpapa.com/js/testkey.html
jxmallett
Parece também que, para eventos importantes nas entradas, o caractere não aparece no campo até que o keyupevento seja disparado.
precisa saber é o seguinte
Último - no iOS (8.2), a tecla backspace aciona apenas um keydownevento, mas o caractere não é removido da entrada até algum tempo depois.
precisa saber é o seguinte
essa é a resposta Isto captura de imprensa tecla delete e Ctrl + V keypress
user1709076
30

O keypressevento pode ser diferente nos navegadores.

Criei um Jsfiddle para comparar eventos de teclado (usando os atalhos do JQuery) no Chrome e Firefox. Dependendo do navegador que você está usando, um keypressevento será acionado ou não - o backspace será acionado keydown/keypress/keyupno Firefox, mas apenas keydown/keyupno Chrome.

Eventos de clique de tecla únicos acionados

no Chrome

  • keydown/keypress/keyupquando o navegador registra uma entrada do teclado ( keypressé acionada)

  • keydown/keyup se nenhuma entrada de teclado (testada com alt, shift, backspace, teclas de seta)

  • keydown apenas para guia?

no Firefox

  • keydown/keypress/keyupquando o navegador registra uma entrada do teclado, mas também para backspace, teclas de seta, guia (então aqui keypressé acionado mesmo sem entrada)

  • keydown/keyup para alt, shift


Isso não deveria surpreender, porque de acordo com https://api.jquery.com/keypress/ :

Nota: como o evento de pressionamento de tecla não é coberto por nenhuma especificação oficial, o comportamento real encontrado ao usá-lo pode diferir entre navegadores, versões e plataformas.

O uso do tipo de evento de pressionamento de tecla foi descontinuado pelo W3C ( http://www.w3.org/TR/DOM-Level-3-Events/#event-type-keypress )

O tipo de evento de pressionamento de tecla é definido nesta especificação para referência e integridade, mas essa especificação substitui o uso desse tipo de evento. Quando em contextos de edição, os autores podem se inscrever no evento beforeinput.


Por fim, para responder à sua pergunta, você deve usar keyupou keydowndetectar um backspace no Firefox e Chrome.


Experimente aqui:

$(".inputTxt").bind("keypress keyup keydown", function (event) {
    var evtType = event.type;
    var eWhich = event.which;
    var echarCode = event.charCode;
    var ekeyCode = event.keyCode;

    switch (evtType) {
        case 'keypress':
            $("#log").html($("#log").html() + "<b>" + evtType + "</b>" + " keycode: " + ekeyCode + " charcode: " + echarCode + " which: " + eWhich + "<br>");
            break;
        case 'keyup':
            $("#log").html($("#log").html() + "<b>" + evtType + "</b>" + " keycode: " + ekeyCode + " charcode: " + echarCode + " which: " + eWhich + "<p>");
            break;
        case 'keydown':
            $("#log").html($("#log").html() + "<b>" + evtType + "</b>" + " keycode: " + ekeyCode + " charcode: " + echarCode + " which: " + eWhich + "<br>");
            break;
        default:
            break;
    }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<input class="inputTxt" type="text" />
<div id="log"></div>

user2314737
fonte
1
Resposta impressionante - principalmente para a explicação das diferentes maneiras de backspace alça em todos os navegadores
Jivan
2
W3School já está feito: w3schools.com/jsref/...
Tân
1
Fragmento de código foi muito útil
John Gilmer
17

Algo que escrevi no caso de alguém se deparar com um problema com pessoas atingindo o backspace enquanto pensam que estão em um campo de formulário

window.addEventListener("keydown", function(e){
    /*
     * keyCode: 8
     * keyIdentifier: "U+0008"
    */
    if(e.keyCode === 8 && document.activeElement !== 'text') {
        e.preventDefault();
        alert('Prevent page from going back');
    }
});
Seth McClaine
fonte
8

Meu controle numérico:

function CheckNumeric(event) {
    var _key = (window.Event) ? event.which : event.keyCode;
    if (_key > 95 && _key < 106) {
        return true;
    }
    else if (_key > 47 && _key < 58) {
        return true;
    }
    else {
        return false;
    }
}

<input type="text" onkeydown="return CheckNumerick(event);" />

tente

O código da tecla BackSpace é 8

VolkanCetinkaya
fonte
6

event.key === "Backspace"

Mais recente e muito mais limpo: use event.key. Chega de códigos numéricos arbitrários!

note.addEventListener('keydown', function(event) {
    const key = event.key; // const {key} = event; ES6+
    if (key === "Backspace") {
        // Do something
    }
});

Documentos do Mozilla

Navegadores suportados

Gibolt
fonte
1
Em 2018, esta é a melhor maneira de fazer isso!
tfantina
Eu tenho usado o código-chave 8 para backspace em todos os idiomas com os quais trabalhei. Aprenda os códigos ASCII, eles não são arbitrários.
André Werlang
3
Só porque você têm vindo a utilizar não significa que não é uma opção melhor. .keyatualmente é a opção recomendada pelos documentos. Além disso, ele suporta vários teclados internacionais com mapeamentos diferentes para qualquer tecla. Eles não são arbitrárias no sentido de que eles são fixos, mas são ao ler código
Gibolt
2

Use um dos eventos keyup / keydown / beforeinput.

com base nessa referência, o pressionamento de tecla é preterido e não é mais recomendado.

O evento de pressionamento de tecla é acionado quando uma tecla que produz um valor de caractere é pressionada. Exemplos de teclas que produzem um valor de caractere são teclas alfabéticas, numéricas e de pontuação. Exemplos de teclas que não produzem um valor de caractere são teclas modificadoras, como Alt, Shift, Ctrl ou Meta.

se você usar "beforeinput", tenha cuidado com a compatibilidade do navegador . a diferença entre "beforeinput" e os outros dois é que "beforeinput" é acionado quando o valor de entrada está prestes a mudar, portanto, com caracteres que não podem alterar o valor de entrada, ele não é acionado (por exemplo, shift, ctr, alt).

Eu tive o mesmo problema e, usando o keyup, foi resolvido.

arash nadali
fonte