Telepon: keyboard numerik untuk input teks

178

Apakah ada cara untuk memaksa keyboard nomor muncul di telepon untuk <input type="text">? Saya baru menyadari bahwa <input type="number">dalam HTML5 adalah untuk "angka floating-point", jadi tidak cocok untuk nomor kartu kredit, kode ZIP, dll.

Saya ingin meniru fungsi keyboard numerik dari <input type="number">, untuk input yang mengambil nilai numerik selain angka floating-point. Apakah ada, mungkin, inputjenis lain yang sesuai yang melakukan itu?

Tami
sumber
Masih belum ada jawaban yang bagus untuk kode pos. Saya mengajukan kembali pertanyaan ini secara khusus untuk kode pos internasional di sini: stackoverflow.com/questions/25425181/…
Ryan McGeary
Saya menemukan cara peretasan untuk melakukan hal ini .. jenis: stackoverflow.com/a/25599024/1922144
davidcondrey
Pada pertengahan 2015, ada cara yang lebih baik untuk melakukan ini: stackoverflow.com/a/31619311/806956
Aaron Grey

Jawaban:

206

Anda bisa melakukannya <input type="text" pattern="\d*">. Ini akan menyebabkan keyboard angka muncul.

Lihat di sini untuk detail lebih lanjut: Panduan Pemrograman Teks, Web, dan Pengeditan untuk iOS

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

Batu Seth
sumber
23
Jika Anda hanya ingin keyboard numerik tetapi tidak ingin memvalidasi (seperti di Chrome), Anda dapat meletakkan atribut novalidate pada formulir. <form ... novalidate>
Brian
4
Saya telah menemukan bahwa \d*itu tidak berfungsi dan [0-9]diperlukan. Perhatikan bahwa ini akan berhasil type='numeric'. Ini disarankan berdasarkan referensi dokumen tertaut untuk kode pos.
Brett Ryan
11
Ini berfungsi selama Anda hanya perlu nilai numerik. Angka titik mengambang yang membutuhkan '.' (atau ',' untuk beberapa daerah) tidak dapat dimasukkan karena keyboard mereka tidak termasuk karakter ini.
DrHall
2
Jika saya perlu menggunakan. (titik), bagaimana saya bisa menggunakannya? pola ini hanya menunjukkan [0-9]
15
<input type = "text" pattern = "\ d *"> tidak bekerja di android? Saya menguji pada ios dan berhasil tetapi tidak bekerja di android. bagaimana saya bisa menyelesaikannya
kamal
158

Pada pertengahan 2015, saya percaya ini adalah solusi terbaik:

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

Ini akan memberi Anda tombol angka di Android dan iOS:

masukkan deskripsi gambar di sini

Ini juga memberi Anda perilaku desktop yang diharapkan dengan tombol panah atas / bawah dan penambahan tombol panah naik / turun ramah keyboard:

masukkan deskripsi gambar di sini

Cobalah dalam cuplikan kode ini:

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

Dengan menggabungkan keduanya type="number"dan pattern="[0-9]*, kami mendapatkan solusi yang berfungsi di mana-mana. Dan, forward-nya kompatibel dengan inputmodeatribut HTML 5.1 yang diusulkan di masa depan .

Catatan: Menggunakan pola akan memicu validasi formulir asli browser. Anda dapat menonaktifkan ini menggunakan novalidateatribut, atau Anda dapat menyesuaikan pesan kesalahan untuk validasi yang gagal menggunakan titleatribut.


Jika Anda harus dapat memasukkan nol, koma, atau huruf terkemuka - misalnya, kode pos internasional - lihat varian kecil ini .


Kredit dan bacaan lebih lanjut:

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

Aaron Grey
sumber
1
HTML5 type="number" spesifikasi mengatakan Atribut konten berikut tidak harus ditentukan dan tidak berlaku untuk elemen: ... inputmode
Tgr
2
@Tgr Ahh, tangkapan yang bagus. Tampaknya spek itu ingin digunakan orang <input type="text" inputmode="numeric">dan ia ingin melihat peramban seluler inputmodeuntuk menentukan apakah itu memperlihatkan papan ketik atau papan ketik penuh. Karena tidak ada browser yang mendukung inputmode, saya tidak yakin bagaimana ini akan diterapkan pada browser desktop vs mobile. Mis: Apakah browser desktop mengizinkan pengetikan huruf <input type="text" inputmode="numeric">? Jika demikian, itu masalah. <input type="number">mencegah ini, hanya memperbolehkan angka. Mungkin kita harus menunggu sampai browser mulai mengimplementasikannya dan kemudian kita dapat memperbarui jawaban ini.
Aaron Gray
2
Dukungan untuk type="number"itu layak , tetapi mungkin menampilkan pemintal yang tidak masuk akal untuk misalnya nomor kartu kredit.
Tgr
2
Memiliki type = "number" adalah rasa sakit di pantat X (. Jika input tidak valid, Anda tidak akan bisa mendapatkan nilai input di JS, Anda tidak bisa mendapatkan posisi kursor, dll.
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

Saya telah menemukan bahwa, setidaknya untuk bidang-bidang "passcode", melakukan sesuatu seperti pada <input type="tel" />akhirnya menghasilkan bidang yang berorientasi nomor paling otentik dan juga memiliki manfaat tanpa autoformatting . Misalnya, dalam aplikasi seluler yang saya kembangkan untuk Hilton baru-baru ini, saya akhirnya menggunakan ini:

Aplikasi Web iPhone Menampilkan dengan Tag Input yang Memiliki Jenis TEL yang Menghasilkan Keyboard Numerik yang Sangat Layak karena Bertentangan dengan Jenis Nomor yang di-Autoformed dan Memiliki Konfigurasi Input yang Kurang Intuitif

... dan klien saya sangat terkesan.

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

Gabriel Ryan Nahmias
sumber
4
Masalahnya bagi saya bukanlah pemformatan otomatis, tetapi validasi. Input tipe numbermemaksa aturan ketat untuk jumlah di banyak browser. Jika pengguna menambahkan spasi (atau koma) untuk memisahkan ribuan Anda tidak akan mendapatkan nilai APA PUN dari input. Ya, bahkan dalam JavaScript input.valueakan kosong. Input tipe teltidak terbatas pada format tertentu sehingga pengguna masih dapat memasukkan apa pun dan validasi adalah proses yang terpisah (untuk ditangani oleh pengembang).
Nux
Bagaimana saya bisa menggunakan angka desimal di keyboard ini
Anto
11

Menggunakan type="email"atau type="url"akan memberi Anda papan ketik pada beberapa ponsel setidaknya, seperti iPhone. Untuk nomor telepon, Anda bisa menggunakan type="tel".

Niklas
sumber
9

Ada bahaya dengan menggunakan <input type="text" pattern="\d*">untuk memunculkan keyboard numerik. Pada firefox dan chrome, ekspresi reguler yang terdapat dalam pola menyebabkan browser memvalidasi input ke ekspresi itu. kesalahan akan terjadi jika tidak cocok dengan pola atau dibiarkan kosong. Waspadai tindakan yang tidak diinginkan di browser lain.

Mike
sumber
6
Menambahkan novalidateatribut pada konten form elementharus menangani masalah validasi otomatis. Pastikan untuk melakukan validasi sendiri.
Justus Romijn
7
<input type="text" inputmode="numeric">

Dengan Inputmode Anda dapat memberikan petunjuk ke browser.

Ralf de Kleine
sumber
4

Saya pikir type="number"yang terbaik untuk halaman web semantik. Jika Anda hanya ingin mengganti keyboard, Anda dapat menggunakan type="number"atau type="tel". Dalam kedua kasus, iPhone tidak membatasi input pengguna. Pengguna masih dapat mengetik (atau menempelkan) karakter apa pun yang diinginkannya. Satu-satunya perubahan adalah keyboard yang ditampilkan kepada pengguna. Jika Anda ingin pembatasan apa pun di luar ini, Anda perlu menggunakan JavaScript.

Kucing Chen
sumber
8
Masalah yang saya miliki adalah bahwa type = "number" hanya seharusnya untuk angka floating point - jadi tidak ada kartu kredit, kode pos, atau bilangan nomor lain hanya berupa string. Saya berharap ada cara semantik untuk menyandikannya serta membuat tampilan keyboard yang tepat. Jenis yang sesuai, saya pikir, akan menjadi input type = "text" tetapi kemudian keyboard yang ditampilkan salah. Jika Anda bisa mengarahkan saya ke beberapa javascript untuk melakukannya, itu akan menyelesaikan kedua masalah.
Tami
2
type="number"adalah untuk mengapung. type="text"adalah untuk string. Yang Anda inginkan adalah integer. Saya pikir float lebih dekat ke integer daripada string. Bagaimana menurut anda?
Cat Chen
6
Satu hal yang perlu diwaspadai dengan type = "number" adalah bahwa Chrome setidaknya akan memaksa input menjadi angka - yang akan memecah nomor kartu kredit yang dimasukkan dengan spasi (misalnya)
John Carter
8
@therefromhere Hal ini juga akan mengubah zip kode seperti 01920untuk 1920.
ceejayoz
itu juga akan kacau jika pengguna memiliki bahasa yang berbeda diatur di browser mereka stackoverflow.com/questions/5345095/…
dalore
4

Bagi saya solusi terbaik adalah:

Untuk angka integer, yang memunculkan pad 0-9 di android dan iphone

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

Anda juga mungkin ingin melakukan ini untuk menyembunyikan pemintal di firefox / chrome / safari, sebagian besar klien berpikir mereka terlihat jelek

 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;
 }

Dan tambahkan novalidate = 'novalidate' ke elemen formulir Anda, jika Anda melakukan validasi khusus

Ps kalau-kalau Anda benar-benar ingin angka floating point setelah semua, langkah ke presisi apa pun yang Anda suka, akan menambahkan '.' ke android

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

Tahun 2018:

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

bekerja untuk Android dan iOS.

Saya menguji pada Android (^ 4.2) dan iOS (11.3)

Shalika Akalanka
sumber
0

Anda dapat mencoba seperti ini:

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

Tapi hati-hati: Jika input Anda mengandung sesuatu selain nomor, itu tidak akan dikirim ke server.

alexwenzel
sumber
0

Saya tidak dapat menemukan jenis yang paling cocok untuk saya dalam semua situasi: Saya perlu default ke entri numerik (entri "7.5" misalnya) tetapi juga pada waktu-waktu tertentu mengizinkan teks ("pass" misalnya). Pengguna menginginkan keypad numerik (entri 7,5 misalnya) tetapi entri teks sesekali diperlukan ("lulus" misalnya).

Alih-alih apa yang saya lakukan adalah menambahkan kotak centang ke formulir dan memungkinkan pengguna untuk beralih input saya (id = "inputSresult") antara type = "number" dan type = "text".

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

Kemudian saya mengirimkan handler klik ke kotak centang yang mengubah jenis antara teks dan nomor berdasarkan apakah kotak centang di atas dicentang:

$(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");

    }
});

Ini bekerja dengan baik untuk kita.

Jeff Mergler
sumber
0
 <input type="text" inputmode="decimal">

itu akan memberi Anda input teks menggunakan tombol angka

Chamin Thilakarathne
sumber