Respostas:
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
Tente em keydown
vez de keypress
.
Os eventos de teclado ocorrem nesta ordem: keydown
, keyup
,keypress
O problema do backspace provavelmente é que o navegador voltará a navegar keyup
e, portanto, sua página não verá o keypress
evento.
keydown
keypress
keyup
. unixpapa.com/js/testkey.html
keyup
evento seja disparado.
keydown
evento, mas o caractere não é removido da entrada até algum tempo depois.
O keypress
evento 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 keypress
evento será acionado ou não - o backspace será acionado keydown/keypress/keyup
no Firefox, mas apenas keydown/keyup
no Chrome.
no Chrome
keydown/keypress/keyup
quando 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/keyup
quando 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 keyup
ou keydown
detectar 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>
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');
}
});
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
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
}
});
.key
atualmente é 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
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.
keypress
eventos em muitos navegadores. Veja unixpapa.com/js/key.html