Tentei resolver isso usando o jQuery pela primeira vez, mas não estava feliz com os caracteres indesejados (sem dígitos) que realmente apareciam no campo de entrada antes de serem removidos na inicialização.
Procurando outras soluções, encontrei o seguinte:
Inteiros (não 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>
Fonte: https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers.onkeypress#Example
Exemplo ao vivo: http://jsfiddle.net/u8sZq/
Pontos decimais (não negativos)
Para permitir um único ponto decimal, você pode fazer algo assim:
<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>
Fonte: Acabei de escrever isso. Parece estar funcionando. Exemplo ao vivo: http://jsfiddle.net/tjBsF/
Outras personalizações
- Para permitir que mais símbolos sejam digitados, adicione-os à expressão regular que está atuando como o filtro básico do código de caracteres.
- Para implementar restrições contextuais simples, observe o conteúdo atual (estado) do campo de entrada (oToCheckField.value)
Algumas coisas que você poderia estar interessado em fazer:
- Somente um ponto decimal permitido
- Permitir sinal de menos somente se posicionado no início da string. Isso permitiria números negativos.
Deficiências
- A posição do cursor não está disponível dentro da função. Isso reduziu bastante as restrições contextuais que você pode implementar (por exemplo, não existem dois símbolos consecutivos iguais). Não tenho certeza qual é a melhor maneira de acessá-lo.
Eu sei que o título pede soluções jQuery, mas espero que alguém ache isso útil de qualquer maneira.