Telefon: metin girişi için sayısal klavye


178

Sayı klavyesini telefonda görünmeye zorlamanın bir yolu var mı <input type="text">? <input type="number">HTML5'te "kayan noktalı sayılar" için olduğunu fark ettim , bu yüzden kredi kartı numaraları, posta kodları vb. İçin uygun değil.

<input type="number">Kayan nokta sayıları dışında sayısal değerler alan girişler için sayısal klavye işlevini taklit etmek istiyorum . Belki de inputbunu yapan uygun başka bir tür var mı?


Posta kodları için hala harika bir cevap yok. Bu soruyu özellikle uluslararası posta kodları için tekrar sordum: stackoverflow.com/questions/25425181/…
Ryan McGeary

Bunu yapmak için hackish bir yol buldum ..sort of: stackoverflow.com/a/25599024/1922144
davidcondrey

2015'in ortalarından itibaren bunu yapmanın daha iyi bir yolu var: stackoverflow.com/a/31619311/806956
Aaron Gray

Yanıtlar:


206

Yapabilirsin <input type="text" pattern="\d*">. Bu, sayısal klavyenin görünmesine neden olur.

Daha fazla ayrıntı için buraya bakın: iOS için Metin, Web ve Düzenleme Programlama Kılavuzu

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


23
Yalnızca sayısal klavyeyi istiyorsanız, ancak (Chrome'da olduğu gibi) doğrulamak istemiyorsanız, novalidate özelliğini forma koyabilirsiniz. <form ... novalidate>
Brian

4
Bunun \d*işe yaramadığını ve [0-9]gerekli olduğunu buldum . Bunun işe yarayacağını unutmayın type='numeric'. Bu, posta kodu için bağlantılı belgeler referansına dayanılarak önerilir.
Brett Ryan

11
Bu, SADECE sayısal değerlere ihtiyacınız olduğu sürece çalışır. '.' Gerektiren kayan nokta sayıları. (veya ',' bazı bölgeler için) girilmez çünkü klavye bu karakterleri içermez.
DrHall

2
Kullanmam gerekirse. (nokta), nasıl kullanabilirim? bu

15
<input type = "text" pattern = "\ d *"> android'de çalışmıyor mu? İOS'ta test ettim ve başarıyla çalıştım, ancak android üzerinde çalışmadı. nasıl çözebilirim
kamal

158

2015'in ortalarından itibaren bunun en iyi çözüm olduğuna inanıyorum:

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

Bu, hem Android hem de iOS'ta sayısal tuş takımını verecektir:

resim açıklamasını buraya girin

Ayrıca, yukarı / aşağı ok düğmeleri ve klavye dostu yukarı / aşağı ok tuşu artışlarıyla beklenen masaüstü davranışını verir:

resim açıklamasını buraya girin

Bu kod snippet'inde deneyin:

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

Hem birleştirerek type="number"ve pattern="[0-9]*biz her yerde çalışır bir çözüm olsun. Ve gelecekteki HTML 5.1 önerilen inputmodeözellik ile ileri uyumlu .

Not: Bir desen kullanmak tarayıcının yerel form doğrulamasını tetikler. novalidateÖzniteliği kullanarak bunu devre dışı bırakabilir veya titleözniteliği kullanarak başarısız bir doğrulama için hata mesajını özelleştirebilirsiniz .


Baştaki sıfırları, virgülleri veya harfleri (örneğin, uluslararası posta kodlarını) girebilmeniz gerekiyorsa, bu küçük değişkeni inceleyin .


Krediler ve ek okumalar:

http://www.smashingmagazine.com/2015/05/form-inputs-browser-support-issue/ http://danielfriesen.name/blog/2013/09/19/input-type-number-and-ios- Sayısal tuş takımı/


1
HTML5 type="number" spesifikasyonu şu içerik özniteliklerinin belirtilmemesi ve öğe için geçerli olmaması gerektiğini
Tgr

2
@Tgr Ahh, iyi yakaladın. Spesifikasyon insanların kullanmasını <input type="text" inputmode="numeric">istiyor ve mobil tarayıcıların inputmodebir sayısal tuş takımı mı yoksa tam klavye mi gösterdiğini belirlemek için bakmasını istiyor gibi görünüyor . Hiçbir tarayıcı desteklenmediğinden inputmode, masaüstü ve mobil tarayıcılara nasıl uygulanacağından emin değilim. Örn: Masaüstü tarayıcılar mektup girmeye izin verecek <input type="text" inputmode="numeric">mi? Eğer öyleyse, bu bir problem. <input type="number">bunu engeller, sadece sayılara izin verir. Belki de tarayıcılar onu uygulamaya başlayana kadar beklememiz gerekecek ve sonra bu cevabı güncelleyebiliriz.
Aaron Gray

2
İçin destek type="number"olan iyi , ama örneğin kredi kartı numaraları çok mantıklı değil bir değer değiştirici görüntüleyebilir.
Tgr

2
X = türünde "= number" olması, giriş geçersizse, JS'de giriş değerini alamazsınız, imleç konumunu vb.
Alamazsınız

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

En azından "parola" benzeri alanlar için, <input type="tel" />en otantik sayı odaklı alanı üretiyor ve aynı zamanda otomatik biçimlendirme yapmanın faydası olmadığını buldum . Örneğin, son zamanlarda Hilton için geliştirdiğim bir mobil uygulamada, bununla devam ettim:

Otomatik Biçimlendirilmiş ve Biraz Daha Az Sezgisel Giriş Yapılandırmasına Sahip Tip Numarasının aksine Çok İyi Sayısal Klavye Üreten TEL Türüne Sahip iPhone Web Uygulaması Ekranı

... ve müvekkilim çok etkilendi.

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


4
Benim için sorun otomatik biçimlendirme değil, doğrulama idi. Tür girişi, numberbirçok tarayıcıdaki sayı için katı kuralları zorlar. Kullanıcı binleri ayırmak için boşluk (veya virgül) eklerse, girişten HERHANGİ bir değer alamazsınız. Evet, JavaScript'te bile input.valueboş olacaktır. Tür girişi telbelirli bir formatla sınırlı değildir, bu nedenle kullanıcı yine de bir şey girebilir ve doğrulama ayrı bir işlemdir (geliştiricinin işlemesi için).
Nux 10'15

Bu klavyede ondalık sayıları nasıl kullanabilirim
Anto

11

Kullanılması type="email"veya type="url"size iPhone gibi en azından bazı telefonlarda, bir klavyeyi verecektir. Telefon numaraları için kullanabilirsiniz type="tel".


9

<input type="text" pattern="\d*">Sayısal klavyeyi açmak için tuşunu kullanma tehlikesi vardır . Firefox ve chrome'da, desen içinde bulunan normal ifade, tarayıcının söz konusu ifadeye girişi doğrulamasına neden olur. kalıpla eşleşmezse veya boş bırakılırsa hatalar oluşur. Diğer tarayıcılardaki istenmeyen eylemlerin farkında olun.


6
İçindekilere bir novalidateöznitelik eklemek form element, otomatik doğrulama sorunlarıyla ilgilenmelidir. Kendi kendinize bir doğrulama işlemi yaptığınızdan emin olun.
Justus Romijn


4

type="number"Semantik web sayfası için en iyisi olduğunu düşünüyorum . Sadece klavyeyi değiştirmek istiyorsanız, kullanabileceğiniz type="number"veya type="tel". Her iki durumda da, iPhone kullanıcı girişini kısıtlamaz. Kullanıcı istediği karakterleri yazabilir (veya yapıştırabilir). Tek değişiklik kullanıcıya gösterilen klavyedir. Bunun ötesinde herhangi bir kısıtlama istiyorsanız, JavaScript kullanmanız gerekir.


8
Sahip olduğum sorun türü = "sayı" sadece kayan nokta sayıları için olması gerekiyordu - kredi kartları, posta kodları, ya da sadece diğer dizelerin bir dizi yok. Hem kodlamanın semantik bir yolunun yanı sıra doğru klavye ekranını yapmayı umuyordum. Uygun tip, sanırım, girdi türü = "metin" olurdu ama sonra yanlış klavye görüntüler. Bana bunu yapmak için bazı javascript işaret edebilir, bu her iki sorunu çözmek olacaktır.
Tami

2
type="number"şamandıra içindir. type="text"dize içindir. Gerçekten istediğiniz tamsayıdır. Ben kayan nokta tamsayı dizeden daha yakın olduğunu düşünüyorum. Ne düşünüyorsun?
Cat Chen

6
Type = "number" ile dikkat edilmesi gereken bir şey, Chrome'un en azından girişi bir sayı olmaya zorlamasıdır - boşluklarla girilen kredi kartı numaralarını kıracaktır (örneğin)
John Carter

8
Aynı zamanda gibi posta kodları dönecek @therefromhere 01920için 1920.
ceejayoz

ayrıca, kullanıcının tarayıcısında farklı bir dil ayarlanmış olması durumunda da
bozulur.

4

Benim için en iyi çözüm:

Android ve iphone'da 0-9 pad'i getiren tamsayılar için

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

Firefox / chrome / safari'deki iplikçikleri gizlemek için bunu yapmak isteyebilirsiniz, çoğu müşteri çirkin göründüklerini düşünüyor

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

Ve özel doğrulama yapıyorsanız form öğenize novalidate = 'novalidate' ekleyin

Ps aslında sonuçta kayan nokta sayıları istemeniz durumunda, istediğiniz hassaslığa adım atın '.' android'e

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

1

2018 yılında:

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

hem Android hem de iOS için çalışıyor.

Android (^ 4.2) ve iOS'ta (11.3) test ettim


0

Bu şekilde deneyebilirsiniz:

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

Ancak dikkatli olun: Girdinizde sayı dışında bir şey varsa, sunucuya iletilmez.


0

Her durumda benim için en iyi çalışan bir tür bulamadım: Sayısal giriş (örneğin "7.5" girişi) varsayılan olarak gerekiyordu, ancak belirli zamanlarda metne izin vermeliyim (örneğin "pass"). Kullanıcılar sayısal bir tuş takımı istediler (örneğin 7.5 girişi), ancak arada sırada metin girişi gerekiyordu (örneğin "pass").

Bunun yerine, forma bir onay kutusu eklemek ve kullanıcının benim giriş (id = "inputSresult") tip = "sayı" ve tip = "metin" arasında geçiş yapmasına izin vermek oldu.

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

Sonra, yukarıdaki onay kutusunun işaretli olup olmadığına bağlı olarak, türü metin ve sayı arasında değiştiren onay kutusuna bir tıklama işleyicisi bağladım:

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

    }
});

Bu bizim için iyi sonuç verdi.




Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.