Come ottenere il valore grezzo di un campo <input type = "number">?


117

Come posso ottenere il valore "reale" di un <input type="number">campo?


Ho una inputscatola e sto usando il tipo di input HTML5 più recente number:

<input id="edQuantity" type="number">

Questo è principalmente supportato in Chrome 29:

inserisci qui la descrizione dell'immagine

Ciò di cui ho bisogno ora è la capacità di leggere il valore "grezzo" che l'utente ha inserito nella casella di input. Se l'utente ha inserito un numero:

inserisci qui la descrizione dell'immagine

allora edQuantity.value = 4, e tutto va bene.

Ma se l'utente inserisce un testo non valido, voglio colorare di rosso la casella di input:

inserisci qui la descrizione dell'immagine

Sfortunatamente, per una type="number"casella di input, se il valore nella casella di testo non è un numero, valuerestituisce una stringa vuota:

edQuantity.value = "" (String);

(almeno in Chrome 29)

Come posso ottenere il valore "grezzo" di un <input type="number">controllo?

ho provato a guardare l'elenco di Chrome di altre proprietà della casella di input:

inserisci qui la descrizione dell'immagine

non ho visto nulla che assomiglia all'ingresso effettivo.

Né sono riuscito a trovare un modo per sapere se la casella "è vuota" o meno. Forse avrei potuto dedurre:

value          isEmpty        Conclusion
=============  =============  ================
"4"            false          valid number
""             true           empty box; not a problem
""             false          invalid text; color it red

Nota : puoi ignorare tutto ciò che segue la riga orizzontale; è solo un riempitivo per giustificare la domanda. Inoltre: non confondere l'esempio con la domanda. Le persone potrebbero volere la risposta a questa domanda per motivi diversi dalla colorazione del riquadro in rosso (Un esempio: convertire il testo "four"nel "4"simbolo latino durante l'evento onBlur)

Come posso ottenere il valore "grezzo" di un <input type="number">controllo?

Lettura bonus


2
Il valore "reale" di un campo di input numerico deve essere un numero. Se si desidera consentire un input diverso dai valori numerici, numbernon è il tipo di input che si sta cercando; utilizzare un textinput normale .
robertc

7
@robertc Chrome è l'agente che consente input diversi dai numeri; ho solo bisogno di sapere che hanno inserito cose diverse dai numeri.
Ian Boyd

1
Controlla lo validitystato del campo : mi sarei aspettato typeMismatchma non ho controllato da solo.
robertc

2
@ int32_t Leggi la sesta riga in basso (ad esempio "Ma se l'utente inserisce ..." )
Ian Boyd

6
Il mio caso d'uso ... Ho due campi numerici: latitudine e longitudine. Vorrei rilevare se qualcuno incolla "lat, lon" e gestirlo in modo appropriato. Questo è attualmente impossibile con type = "number". poiché "lat, lon" non è valido .. non c'è modo di ottenere il valore "grezzo" per eseguire un'espressione regolare. Un altro caso d'uso: visualizzazione di un errore del cliente: " blahè un numero non valido".
Brad Kent

Risposte:


55

Secondo WHATWG , non dovresti essere in grado di ottenere il valore a meno che non sia un input numerico valido. L'algoritmo di sanificazione del campo del numero di input dice che il browser dovrebbe impostare il valore su una stringa vuota se l'input non è un numero in virgola mobile valido.

L' algoritmo di sanificazione del valore è il seguente: Se il valore dell'elemento non è un numero in virgola mobile valido , impostalo invece sulla stringa vuota.

Specificando il tipo ( <input type="number">) chiedi al browser di eseguire un lavoro per te. Se, d'altra parte, desideri essere in grado di catturare l'input non numerico e fare qualcosa con esso, dovresti fare affidamento sul vecchio campo di input di testo provato e vero e analizzare il contenuto da solo.

Anche il W3 ha le stesse specifiche e aggiunge:

I programmi utente non devono consentire all'utente di impostare il valore su una stringa non vuota che non è un numero a virgola mobile valido.


6
Sarebbe utile se i programmi utente non permettessero all'utente di impostare il valore su una stringa non vuota che non è un numero a virgola mobile valido. Ma se whatwg dice che non può essere fatto; allora questa è la risposta. Soluzione alternativa per la mia esigenza attuale aggiunta di seguito.
Ian Boyd

57
Specificando il tipo ( <input type="number">) chiedi al browser di eseguire un lavoro per te. Personalmente, stavo solo chiedendo ai browser mobili di mostrare un tastierino numerico e ho ottenuto la convalida come uno spiacevole extra. La maggior parte di questi problemi derivano dal fatto che l' typeattributo determina sia le regole di convalida che le regole su quale meccanismo di input visualizzare, ma è del tutto possibile voler mostrare una tastiera numerica agli utenti mobili senza che la convalida del numero venga applicata anche agli utenti desktop. HTML 5.1 risolverà almeno questo problema alla fine con l' inputmodeattributo.
Mark Amery

4
ma quando il browser non fa abbastanza, vorrei essere in grado di completarlo. come rimuovere spazi nell'input, dedurre il punto decimale ...
njzk2

1
inoltre, in varie lingue, come il francese, ci sono 2 parole per numero. uno per i numeri come identificatori, come i numeri di carte di credito, e uno per il conteggio dei numeri, come i numeri in virgola mobile.
njzk2

1
@MotiKorets non funziona per l'inserimento di numeri in virgola mobile poiché gli iPhone non inseriscono un punto decimale sulla tastiera. Sfortunatamente gli sviluppatori sono piuttosto fregati al momento per quanto riguarda la fornitura di una bella UX di ingresso in virgola mobile ...
Andy

50

Non risponde alla domanda, ma la soluzione utile è controllare

edQuantity.validity.valid

Il ValidityStatesimbolo di un oggetto fornisce indizi su ciò che l'utente ha inserito. Considera un type="number"input con un set minemax

<input type="number" min="1" max="10">

Vogliamo sempre usare .validity.valid.

Altre proprietà forniscono solo informazioni sui bonus:

User's Input  .value  .valid | .badInput  .rangeUnderflow  .rangeOverflow
============  ======  ====== | =========  ===============  ==============
""            ""      true   | false      false            false  ;valid because field not marked required
"1"           "1"     true   | false      false            false  
"10"          "10"    true   | false      false            false
"0"           "0"     false  | false      true             false  ;invalid because below min
"11"          "11"    false  | false      false            true   ;invalid because above max
"q"           ""      false  | true       false            false  ;invalid because not number
"³"           ""      false  | true       false            false  ;superscript digit 3
"٣"           ""      false  | true       false            false  ;arabic digit 3
"₃"           ""      false  | true       false            false  ;subscript digit 3

Dovrai assicurarti che il browser supporti la convalida HTML5 prima di utilizzarlo:

function ValidateElementAsNumber(element)
{
   //Public Domain: no attribution required.
   if ((element.validity) && (!element.validity.valid))
   {
      //if html5 validation says it's bad: it's bad
      return false;
   }

   //Fallback to browsers that don't yet support html5 input validation
   //Or we maybe want to perform additional validations
   var value = StrToInt(element.value);
   if (value != null)
      return true;
   else
      return false;
}

indennità

Spudly ha una risposta utile che ha cancellato:

Usa semplicemente il :invalidselettore CSS per questo.

input[type=number]:invalid {
    background-color: #FFCCCC;
}

Questo farà sì che il tuo elemento diventi rosso ogni volta che viene inserito un valore non numerico valido.

Il supporto del browser per <input type='number'>è più o meno lo stesso di :invalid, quindi nessun problema.

Maggiori informazioni :invalid qui .


Non funziona in Opera. Dice valido anche se inserisci una stringa.
Bergi

Opera supporta la .validityproprietà, ma non la gestisce correttamente .valid?!
Ian Boyd

Sì, ma quando un numero immesso non è valido ? Funziona come se l'input fosse vuoto. A typeMismatchpotrebbe avere senso, ma è solo per i tipi di email o URL ...
Bergi

@Bergi La tabella sopra fornisce esempi in cui i numeri inseriti possono non essere validi: "q", "11" (quindi il massimo è 10), "0" (quando il minimo è 1), "" (quindi l'elemento è required)
Ian Boyd

1
@Bergi è .badInputstato aggiunto il 20/11/2012 . Ma nessuno dovrebbe guardare badInputper vedere se l'input è valido; dovrebbero guardare .valid. È possibile (e corretto) .badInputche sia falso e che abbia ancora un input non valido. .validè definito come l'assenza di eventuali errori di convalida (ad es. mancate corrispondenze, overflow, underflow), di cui .badInputè solo un tipo di errore. Nota il grafico sopra dove .badInputè falso, ma l'input non è ancora valido.
Ian Boyd


4

Tieni traccia di tutti i tasti premuti in base ai loro codici chiave

Suppongo che si possa ascoltare gli eventi keyup e mantenere un array di tutti i caratteri inseriti, in base ai loro keycode. Ma è un compito piuttosto noioso e probabilmente soggetto a bug.

http://unixpapa.com/js/key.html

Seleziona l'input e ottieni la selezione come stringa

document.querySelector('input').addEventListener('input', onInput);

function onInput(){
  this.select(); 
  console.log( window.getSelection().toString() )
}
<input type='number'>

Tutto il merito a: int32_t


Quella soluzione è stata provata altrove e non funziona . Soprattutto quando le presse degli utenti Delete, Backspace, Ctrl+X, Ctrl+V, Right-click-cut, Right-click-paste.
Ian Boyd

Sono d'accordo con te, fondamentalmente ciò che l'OP ha chiesto non è possibile. Tuttavia, entrambi gli hack che ho menzionato (e sono hack, non lo nego) funzionano in una certa misura. Forse possono essere utili a qualcuno, in qualche caso?
sandstrom

sorprendentemente, la cosa di selezione sembra funzionare. Quali sono i limiti di quel metodo?
njzk2

Limitazioni: il testo è selezionato visivamente. Se l'utente digita qualcosa, il contenuto
sparirà

Modificato con una demo dal vivo che mostra quanto sia dannoso questo metodo
vsync
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.