Telefono: tastiera numerica per l'immissione di testo


178

C'è un modo per forzare la tastiera numerica a venire al telefono per un <input type="text">? Ho appena capito che <input type="number">in HTML5 è per "numeri in virgola mobile", quindi non è adatto per numeri di carta di credito, codici postali, ecc.

Voglio emulare la funzionalità della tastiera numerica di <input type="number">, per input che accettano valori numerici diversi dai numeri in virgola mobile. C'è forse un altro inputtipo appropriato che lo fa?


Non c'è ancora un'ottima risposta per i codici postali. Ho fatto di nuovo questa domanda specificamente per i codici postali internazionali qui: stackoverflow.com/questions/25425181/…
Ryan McGeary,

Ho trovato un modo per fare questo hackish ..sort di: stackoverflow.com/a/25599024/1922144
davidcondrey

A partire dalla metà del 2015, esiste un modo migliore per farlo: stackoverflow.com/a/31619311/806956
Aaron Gray,

Risposte:


206

Si può fare <input type="text" pattern="\d*">. Ciò farà apparire la tastiera numerica.

Vedi qui per maggiori dettagli: Guida alla programmazione di testi, Web e modifiche per iOS

<form>
  <input type="text" pattern="\d*">
  <button type="submit">Submit</button>
</form>


23
Se vuoi solo la tastiera numerica ma non vuoi convalidare (come in Chrome), puoi inserire l'attributo novalidate nel modulo. <form ... novalidate>
Brian

4
Ho scoperto che \d*non funziona ed [0-9]è necessario. Si noti che questo funzionerà con type='numeric'. Questo è suggerito in base al riferimento dei documenti collegati per il codice postale.
Brett Ryan,

11
Funziona finché hai bisogno SOLO di valori numerici. Numeri in virgola mobile che richiedono un '.' (o ',' per alcune regioni) non possono essere immessi in quanto la tastiera non include questi caratteri.
DrHall,

2
Se ho bisogno di usare. (punto), come posso usarlo? questo modello mostra solo [0-9]

15
<input type = "text" pattern = "\ d *"> non funziona su Android? Ho provato su iOS e ha funzionato con successo ma non ha funzionato su Android. come posso risolverlo
kamal

158

A partire dalla metà del 2015, credo che questa sia la soluzione migliore:

<input type="number" pattern="[0-9]*" inputmode="numeric">

Questo ti darà il tastierino numerico su Android e iOS:

inserisci qui la descrizione dell'immagine

Ti dà anche il comportamento previsto del desktop con i pulsanti freccia su / giù e l'incremento del tasto freccia su / giù intuitivo della tastiera:

inserisci qui la descrizione dell'immagine

Provalo in questo frammento di codice:

<form>
  <input type="number" pattern="[0-9]*" inputmode="numeric">
  <button type="submit">Submit</button>
</form>

Combinando entrambi type="number"e pattern="[0-9]*, otteniamo una soluzione che funziona ovunque. Inoltre, è compatibile con il futuro inputmodeattributo proposto per HTML 5.1 .

Nota: l'utilizzo di un modello attiverà la convalida del modulo nativo del browser. È possibile disabilitarlo utilizzando l' novalidateattributo oppure personalizzare il messaggio di errore per una convalida non riuscita utilizzando l' titleattributo.


Se devi essere in grado di inserire zeri, virgole o lettere iniziali, ad esempio codici postali internazionali, dai un'occhiata a questa leggera variante .


Crediti e approfondimenti:

http://www.smashingmagazine.com/2015/05/form-inputs-browser-support-issue/ http://danielfriesen.name/blog/2013/09/19/input-type-number-and-ios- tastiera numerica/


1
La type="number" specifica HTML5 dice che i seguenti attributi di contenuto non devono essere specificati e non si applicano all'elemento: ... inputmode
Tgr

2
@Tgr Ahh, buona cattura. Sembra che la specifica vuole che le persone usino <input type="text" inputmode="numeric">e vuole che i browser mobili guardino inputmodeper determinare se mostra un tastierino numerico o una tastiera completa. Dal momento che nessun browser supporta inputmode, non sono sicuro di come verrà implementato sui browser desktop rispetto a quelli mobili. Es .: I browser desktop consentiranno la digitazione di lettere <input type="text" inputmode="numeric">? Se è così, questo è un problema. <input type="number">impedisce questo, consentendo solo numeri. Forse dovremo aspettare fino a quando i browser inizieranno a implementarlo e quindi potremo aggiornare questa risposta.
Aaron Gray,

2
Il supporto per type="number"è decente , ma potrebbe mostrare uno spinner che non ha molto senso, ad esempio, per i numeri di carta di credito.
Tgr

2
Avere type = "number" è un dolore nel culo X (. Se l'input non è valido, non sarai in grado di ottenere il valore dell'input in JS, non puoi ottenere la posizione del cursore, ecc.
Nicu Surdu,

2
This attribute applies when the value of the type attribute is text, search, tel, url, email, or password, otherwise it is ignored.
Michael Laffargue,

61

Ho scoperto che, almeno per i campi simili a "passcode", fare qualcosa di simile <input type="tel" />finisce per produrre il campo con il numero più autentico e ha anche il vantaggio di non essere formattato automaticamente . Ad esempio, in un'applicazione mobile che ho sviluppato di recente per Hilton, ho finito con questo:

Visualizzazione dell'applicazione Web iPhone con un tag di input con un tipo di TEL che produce una tastiera numerica molto decente rispetto al tipo di numero che è formattato automaticamente e ha una configurazione di input un po 'meno intuitiva

... e il mio cliente è stato molto colpito.

<form>
  <input type="tel" />
  <button type="submit">Submit</button>
</form>


4
Il problema per me non era la formattazione automatica, ma la convalida. L'immissione del tipo numberimpone regole rigide per il numero in molti browser. Se l'utente aggiunge spazio (o virgola) per separare migliaia non otterrai QUALSIASI valore dall'input. Sì, anche in JavaScript input.valuesarà vuoto. L'immissione di tipo telnon è limitata a un formato specifico, quindi l'utente può comunque inserire qualsiasi cosa e la convalida è un processo separato (che lo sviluppatore deve gestire).
Nux

Come posso usare i numeri decimali in questa tastiera
Anto

11

L'uso di type="email"o type="url"ti darà almeno una tastiera su alcuni telefoni, come iPhone. Per i numeri di telefono, è possibile utilizzare type="tel".


9

Esiste un pericolo nell'uso del <input type="text" pattern="\d*">per far apparire la tastiera numerica. Su Firefox e Chrome, l'espressione regolare contenuta nel modello fa sì che il browser convalidi l'input per quell'espressione. si verificheranno errori se non corrispondono al modello o se vengono lasciati vuoti. Fai attenzione alle azioni indesiderate in altri browser.


6
L'aggiunta di un novalidateattributo al contenimento form elementdovrebbe gestire i problemi di auto-validazione. Assicurati di fare un po 'di validazione da solo.
Justus Romijn


4

Penso che type="number"sia il migliore per la pagina web semantica. Se vuoi solo cambiare la tastiera, puoi usare type="number"o type="tel". In entrambi i casi, iPhone non limita l'input dell'utente. L'utente può comunque digitare (o incollare) tutti i caratteri che desidera. L'unica modifica è la tastiera mostrata all'utente. Se si desidera qualsiasi restrizione oltre a ciò, è necessario utilizzare JavaScript.


8
Il problema che ho è che type = "number" dovrebbe essere solo per i numeri in virgola mobile, quindi nessuna carta di credito, codice postale o una serie di altre stringhe solo di numeri. Speravo ci fosse sia un modo semantico di codificarlo sia di visualizzare la tastiera giusta. Il tipo appropriato, penso, sarebbe input type = "text" ma poi viene visualizzata la tastiera sbagliata. Se potessi indicarmi un po 'di javascript per farlo, ciò risolverebbe entrambi i problemi.
Tami,

2
type="number"è per il galleggiante. type="text"è per stringa. Quello che vuoi veramente è intero. Penso che float sia più vicino all'intero che alla stringa. Cosa ne pensi?
Cat Chen,

6
Una cosa da tenere d'occhio con type = "number" è che Chrome forzerà almeno l'input a essere un numero - che romperà i numeri di carta di credito inseriti con spazi (ad esempio)
John Carter,

8
@therefromhere Sarà anche girare zip codici come 01920a 1920.
Ceejayoz,

sarà anche rovinare se l'utente ha un insieme lingua diversa nel loro browser stackoverflow.com/questions/5345095/...
dalore

4

Per me la soluzione migliore era:

Per i numeri interi, che visualizza il pad 0-9 su Android e iPhone

<label for="ting">
<input id="ting" name="ting" type="number" pattern="[\d]*" />

Potresti anche voler fare questo per nascondere i filatori in Firefox / Chrome / Safari, la maggior parte dei clienti pensa che siano brutti

 input[type=number]::-webkit-inner-spin-button,
 input[type=number]::-webkit-outer-spin-button {
      -webkit-appearance: none;
      margin: 0;
 }

 input[type=number] {
      -moz-appearance:textfield;
 }

E aggiungi novalidate = 'novalidate' all'elemento del modulo, se stai eseguendo una convalida personalizzata

Ps nel caso in cui volessi davvero numeri in virgola mobile, dopotutto, passa a qualsiasi precisione tu voglia, aggiungerà '. ad Android

<label for="ting">
<input id="ting" name="ting" type="number" pattern="[\d\.]*" step="0.01" />

1

Nel 2018:

<input type="number" pattern="\d*">

funziona sia per Android che per iOS.

Ho testato su Android (^ 4.2) e iOS (11.3)


0

Puoi provare così:

<input type="number" name="input">
<input type="submit" value="Next" formnovalidate="formnovalidate">

Ma fai attenzione: se il tuo input contiene qualcosa di diverso da un numero, non verrà trasmesso al server.


0

Non sono riuscito a trovare un tipo che funzionasse meglio per me in tutte le situazioni: avevo bisogno di inserire automaticamente i valori numerici (ad esempio "7.5"), ma in certi momenti consentire il testo ("passa" ad esempio). Gli utenti desideravano un tastierino numerico (ad esempio una voce di 7.5), ma era necessario inserire un testo occasionale (ad esempio "passa").

Piuttosto quello che ho fatto è stato aggiungere una casella al modulo e consentire all'utente di alternare il mio input (id = "inputSresult") tra type = "number" e type = "text".

<input type="number" id="result"... >
<label><input id="cbAllowTextResults" type="checkbox" ...>Allow entry of text results.</label>

Quindi ho collegato un gestore di clic alla casella di controllo che alterna il tipo tra testo e numero in base al fatto che la casella di controllo sopra sia selezionata:

$(document).ready(function () {
    var cb = document.getElementById('cbAllowTextResults');
    cb.onclick = function (event) {
        if ($("#cbAllowTextResults").is(":checked"))
            $("#result").attr("type", "text");
        else
            $("#result").attr("type", "number");

    }
});

Questo ha funzionato bene per noi.


0
 <input type="text" inputmode="decimal">

ti darà l'immissione di testo usando il tastierino numerico



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.