Como posso obter o valor "real" de um <input type="number">
campo?
Eu tenho uma input
caixa e estou usando o tipo de entrada HTML5 mais recente number
:
<input id="edQuantity" type="number">
Isso é principalmente compatível com o Chrome 29:
O que eu preciso agora é a capacidade de ler o valor "bruto" que o usuário inseriu na caixa de entrada. Se o usuário inseriu um número:
então edQuantity.value = 4
, e tudo está bem.
Mas se o usuário inserir um texto inválido, quero colorir a caixa de entrada de vermelho:
Infelizmente, para uma type="number"
caixa de entrada, se o valor na caixa de texto não for um número, value
retorna uma string vazia:
edQuantity.value = "" (String);
(no Chrome 29, pelo menos)
Como posso obter o valor "bruto" de um <input type="number">
controle?
Tentei olhar a lista do Chrome de outras propriedades da caixa de entrada:
não vi nada que se pareça com a entrada real.
Nem consegui encontrar uma maneira de saber se a caixa "está vazia" ou não. Talvez eu pudesse ter inferido:
value isEmpty Conclusion
============= ============= ================
"4" false valid number
"" true empty box; not a problem
"" false invalid text; color it red
Nota : Você pode ignorar tudo após a régua horizontal; é apenas um preenchimento para justificar a pergunta. Além disso: não confunda o exemplo com a pergunta. As pessoas podem querer a resposta a esta pergunta por outras razões além de colorir a caixa de vermelho (um exemplo: converter o texto "four"
no "4"
símbolo latino durante o evento onBlur)
Como posso obter o valor "bruto" de um <input type="number">
controle?
Leitura de bônus
fonte
number
este não é o tipo de entrada que você está procurando; use umatext
entrada normal .validity
estado do campo - seria de esperar,typeMismatch
mas não verifiquei sozinho.blah
é um número inválido".Respostas:
De acordo com o WHATWG , você não deve ser capaz de obter o valor a menos que seja uma entrada numérica válida. O algoritmo de sanitização do campo de número de entrada diz que o navegador deve definir o valor como uma string vazia se a entrada não for um número de ponto flutuante válido.
Ao especificar o type (
<input type="number">
), você está pedindo ao navegador para fazer algum trabalho para você. Se, por outro lado, você gostaria de ser capaz de capturar a entrada não numérica e fazer algo com ela, você teria que contar com o antigo campo de entrada de texto testado e comprovado e analisar o conteúdo você mesmo.O W3 também tem as mesmas especificações e adiciona:
fonte
<input type="number">
), você está pedindo ao navegador para fazer algum trabalho para você. Pessoalmente, estava apenas pedindo aos navegadores móveis que mostrassem um teclado numérico e recebi a validação como um extra desagradável. A maioria desses problemas se origina do fato de que otype
atributo determina regras de validação e regras sobre qual mecanismo de entrada exibir, mas é bem possível querer mostrar um teclado numérico para usuários móveis sem também querer validação de número aplicada a usuários de desktop. O HTML 5.1 irá pelo menos resolver este problema eventualmente com oinputmode
atributo.Não responde à pergunta, mas a solução útil é verificar
O
ValidityState
de um objeto fornece pistas sobre o que o usuário inseriu. Considere umatype="number"
entrada com ummin
emax
conjuntoNós sempre quer usar
.validity.valid
.Outras propriedades fornecem apenas informações de bônus:
Você terá que se certificar de que o navegador suporta validação HTML5 antes de usá-lo:
Bônus
Spudly tem uma resposta útil que excluiu:
fonte
.validity
propriedade, mas não controla corretamente.valid
?!typeMismatch
pode fazer sentido, mas isso é apenas para tipos de e-mail ou url…required
).badInput
foi adicionado em 20/11/2012 . Mas ninguém deve olharbadInput
para ver se a entrada é válida; eles deveriam estar olhando.valid
. É possível (e correto).badInput
ser falso e ainda ter entrada inválida..valid
é definido como a ausência de quaisquer erros de validação (por exemplo, incompatibilidades, overflows, underflows), dos quais.badInput
é apenas um tipo de erro. Observe o gráfico acima onde.badInput
é falso, mas a entrada ainda é inválida.fonte
Rastreie todas as teclas pressionadas com base em seus códigos de tecla
Suponho que se possa ouvir os eventos de ativação e manter uma matriz de todos os caracteres inseridos, com base em seus códigos de tecla. Mas é uma tarefa muito tediosa e provavelmente sujeita a bugs.
http://unixpapa.com/js/key.html
Selecione a entrada e obtenha a seleção como uma string
Todo o crédito para: int32_t
fonte
Delete
,Backspace
,Ctrl+X
,Ctrl+V
,Right-click-cut
,Right-click-paste
.