Javascript: Erro bizarro! Mesma tecla, key code diferente!

Boa tarde pessoal, estou com um problema aqui no trabalho para resolver que todos acharam estranho e ninguem soube resolver ou explicar, então venho perguntar a vocês se ja passaram por isso ou se sabem algo a respeito.

Temos dois portais com o mesmo core, ou seja apenas algumas coisas mudam de um portal para o outro.
Temos nesse core o arquivo Util.js com essa função:

function formatCEP(e, src, mask) { var key = null; if (window.event) { key = e.keyCode; } else if(e.which) { key = e.which; } if((key > 47 && key < 58) || (key > 93 && key < 106)) { var i = src.value.length; var saida = mask.substring(0,1); var texto = mask.substring(i); if (texto.substring(0,1) != saida) { src.value += texto.substring(0,1); } return true; } else { if (key != 8 && !(key > 36 && key < 41) && key != 46) { return false; } else { return true; } } }

A seguinte verificação no if (key > 93 && key < 106) seria as teclas do teclado numerico, que eu acrecentei ao ver que não funcionava o teclado numerico no segundo portal e então passou a dar erro no primeiro portal.

Testando tive os seguintes resultados

N = numpad
Portal 1 = Primeiro Portal
Portal 2 = Segundo Portal

tecla ------ key code Portal 1 ------ key code Portal 2
– 1 ----------------- 49 ------------------------- 49

  • N1 --------------- 49 -------------------------- 97
    – a ----------------- 97 ------------------------- 65

Então como resultado no Portal 1 ele passou a aceitar letras e no 2 esta funcionando direito.

Alguem tem alguma pista de porque essa mudança de keycode da mesma tecla de um portal para o outro?

Ambos foram testados na mesma maquina.

Valew pela ajuda

Analisando melhor os textfields que chamam essa função percebi uma diferença:

No do portal 1 ele usa o evento

onkeypress="return formatCEP(event,this,'#####-###');" e
no do portal 2 ele usa os seguintes eventos :

onkeydown="return formatCEP(event,this,'#####-###');" onkeyup="return formatCEP(event,this,'#####-###');" onkeypress="return formatCEP(event,this,'#####-###');"

No portal 2, ao colocar alert na função para ver o key code, percebo que quando digito o numero 1 por exemplo ele chama a função duas vezes, a primeira ele retorna o keycode 97 e quando entra de novo o 49.

Gostaria de entender melhor isso, porque ele chamou duas vezes e porque na primeira mostrou um valor e na segunda outro. Podem me explicar por favor?

Valew

keyUp -> chamado quando você solta a tecla
keyDown -> chamado quando você aperta a tecla
keyPress -> é uma composição das teclas que foram apertadas, e chamado normalmente quando se solta a tecla (pode ser que nem seja chamado, por exemplo)

Se está chamando uma, duas ou três vezes, é porque foi registrado em todos os eventos - normalmente não se faz isso, a menos que você tenha uma explicação muito boa para isso. Eu normalmente deixaria em keyUp ou keyPress, dependendo do tipo de tratamento das teclas; algumas coisas que dependem de a tecla ter sido corretamente interpretada - por exemplo, diferenciar ] de º , que são duas coisas diferentes que estão na mesma tecla, mas dependem de outras teclas - devem ser postas em keyPress. Outras, que dependem da interpretação das teclas - por exemplo, capturar uma tecla Alt sozinha - devem ser postas em keyUp. Mas tudo depende de como foi programado o Javascript.

Tendi. Valew

Só mais uma duvida, pq na primeira vez que chama, ao clicar o 1 do numpad, ele exibe 97 e na segunda 49, que seria o mesmo key code da tacla 1?

Sei lá. Que tal deixar os dois portais iguais?

Sim, ja fiz. Deu certo =D.

Só queria saber a diferença. Pois se um dia eu precisar tratar diferente ou ver o erro novamente ja vou saber.

Não conheço bem Javascript (eufemismo para “não sei p nenhuma”). Entretanto, sei que há uma diferença entre “códigos das teclas” ou “scan codes” - por exemplo, a tecla Shift tem um código - e caracteres ASCII gerados pelas teclas.
A tecla 9 do teclado numérico tem um “scan code” diferente da tecla 9 do teclado normal, mas ambas têm o mesmo valor ASCII, que é ‘9’ ou em decimal, o número 57 (ou 39 em hexadecimal).
Se não me engano, keyPressed retorna o valor ASCII e keyUp o código da tecla, ou scan code. Mas não tenho certeza.