honestamente y personalmente no le encuentro sentido por que validar por tecla en lugar de contenido. y ese es parte del problema que tienes. si intentas mostrar el codigo de la tecla presionada (keyCode o which) con los eventos onkeypress y onkeyup, veras que en algunas teclas devuelve un numero diferente. considera por ejemplo el punto, en onkeypress equivale a 46 mientras que onkeyup equivale 190. entonces, cuando conviertes ese valor a caracter con String.fromCharCode, los resultados son diferentes. entonces, al final estas validando el resultado de fromCharCode con una expresion. segun afirmas que con onclick u onsubmit te funciona, lo cual me esta raro porque dichos eventos no crean la propiedad which o keyCode ya que no son eventos relacionados al teclado.
no se si tu intencion es crear una mascara. no te puedo ayudar mucho en esa parte porque en mi experiencia he tenido unas dificultades y prefiero hacerlo de otras formas, pero siempre validando por contenido. una de las formas es eliminar caracteres indeseados cuando se presionan las teclas.
Código:
<input onkeyup="
var pattern = /[^0-9\.]/g; // cualquier cosa que no sea numero y punto;
this.value = this.value.replace(pattern, '');
" />
otra forma es validar el contenido cuando el campo cambia de valor o pierde foco, pero esto no dara el sentido de mascara. fijate que son dos eventos diferentes a pesar que el evento de
mutacion de datos o cambio de valor se produce cuando el campo pierde foco.
Código:
<input onchange="
var pattern = /^\d+(\.\d+)?$/; // cualquier cosa que no sea numero y punto;
if(!pattern.test(this.value)){
// realizar alguna accion si el campo no es valido;
// por ejemplo, mostrar una imagen de invalido, mostrar un mensaje;
}
" />