Filtro de caracteres inseridos na entrada. Como desabilitar certos caracteres na entrada? Impedir a inserção de letras na entrada

25.10.2021

Recebi uma tarefa bastante padrão: filtrar os caracteres inseridos pelo usuário na entrada, ou seja, o usuário pode inserir um conjunto de números e letras em uma linha, por exemplo, “5s68d.4r55e.6t5”, e para o servidor eu deve enviar a quantia correta em rublos para poupança - "568.455" (rublos).

Concluí a tarefa com rapidez suficiente, anexando um evento focusout à entrada, mas minha solução tinha uma série de desvantagens importantes: onde em neste exemplo o valor em rublos termina e os copeques começam? Se o usuário inserir vários pontos negativos (valores negativos também estão corretos neste caso), qual dos pontos negativos deve ser considerado o início da linha? E assim por diante.

Portanto, apareceu uma segunda versão do script com expressões regulares para o evento keyup:

$(e.currentTarget).val(($(e.currentTarget).val()).replace(/[^0123456789.-]/, ""))
Mas, como se viu, este método tinha uma desvantagem notável (não quero dizer que o usuário veja o caractere que ele insere e então esse caractere desapareça), ou seja, se você colocar o cursor, por exemplo, no meio do inseriu o número na entrada, insira uma letra, então o script cortará a letra, mas moverá os cursos para o final da linha.

Por esse motivo, um amigo mais velho me instruiu a escrever uma função para o evento de pressionamento de tecla. Após 30 minutos, a terceira versão da função estava pronta e ficou mais ou menos assim:

Function() ( return this.each(function() ( $(this).keydown(function(e) ( var key = e.charCode || e.keyCode || 0; // permitir backspace, tab, delete, enter , setas, números e números do teclado SOMENTE // retorno decimal inicial, final, ponto e teclado numérico (tecla == 8 || tecla == 9 || tecla == 13 || tecla == 46 || tecla == 110 || tecla == 110 | | chave == 190 || (chave >= 35 && chave = 48 && chave = 96 && chave