Qual é a maneira correta de filtrar valores numéricos para um campo de texto?

Estou trabalhando em um campo de texto trabalhando com o tipo de validação que não permite que você insira valores diferentes dos numéricos. Assim, meu código inicial parecia bastante simples e semelhante a isso:

$(textField).onKeyPress(function(e) {
    if (e.which < 48 && e.which > 57)
        e.preventDefault();
});

Isso é bastante claro, mas vira que (na versão mais recente de todos os navegadores) o Firefox fará isso também impedir o movimento com as teclas de seta e as teclas delete / backspace, enquanto os outros navegadores não.

Olhando em volta, descobri que precisaria também verificar essas chaves e verificar as diferentes propriedades expostas noe referência de evento.

Meu código final é algo como isto:

$(textField).onKeyPress(function(e) {
    var code = e.which || e.keyCode;
    if (code > 31  // is not a control key
        && (code < 37 || code > 40) // is not an arrow key
        && (code < 48 || code > 57) // is not numeric
        && (code != 46) // is not the delete key
    )
        e.preventDefault();
});

No entanto, isso parece ser muito para resolver um problema bastante simples como apenas evitar não-numérico.

O que estou fazendo de errado? Qual é a melhor prática em termos desse tipo de validação?

questionAnswers(3)

yourAnswerToTheQuestion