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.