Primero intenté resolver esto usando jQuery, pero no estaba contento con los caracteres no deseados (sin dígitos) que realmente aparecían en el campo de entrada justo antes de ser eliminados en el keyup.
Buscando otras soluciones encontré esto:
Enteros (no negativos)
<script>
function numbersOnly(oToCheckField, oKeyEvent) {
return oKeyEvent.charCode === 0 ||
/\d/.test(String.fromCharCode(oKeyEvent.charCode));
}
</script>
<form name="myForm">
<p>Enter numbers only: <input type="text" name="myInput"
onkeypress="return numbersOnly(this, event);"
onpaste="return false;" /></p>
</form>
Fuente: https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers.onkeypress#Example
Ejemplo en vivo: http://jsfiddle.net/u8sZq/
Puntos decimales (no negativos)
Para permitir un solo punto decimal, puede hacer algo como esto:
<script>
function numbersOnly(oToCheckField, oKeyEvent) {
var s = String.fromCharCode(oKeyEvent.charCode);
var containsDecimalPoint = /\./.test(oToCheckField.value);
return oKeyEvent.charCode === 0 || /\d/.test(s) ||
/\./.test(s) && !containsDecimalPoint;
}
</script>
Fuente: Acabo de escribir esto. Parece estar funcionando. Ejemplo en vivo: http://jsfiddle.net/tjBsF/
Otras personalizaciones
- Para permitir que se escriban más símbolos, simplemente agréguelos a la expresión regular que actúa como filtro de código de caracteres básico.
- Para implementar restricciones contextuales simples, observe el contenido (estado) actual del campo de entrada (oToCheckField.value)
Algunas cosas que te pueden interesar:
- Solo se permite un punto decimal
- Permita el signo menos solo si se coloca al comienzo de la cadena. Esto permitiría números negativos.
Deficiencias
- La posición del cursor no está disponible dentro de la función. Esto redujo en gran medida las restricciones contextuales que puede implementar (por ejemplo, no hay dos símbolos iguales consecutivos). No estoy seguro de cuál es la mejor manera de acceder.
Sé que el título pide soluciones jQuery, pero espero que a alguien le resulte útil de todos modos.