<İnput type = "number"> alanına ham değer nasıl alınır?


117

Bir alanın "gerçek" değerini nasıl alabilirim <input type="number">?


Bir inputkutum var ve daha yeni HTML5 girdi türü kullanıyorum number:

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

Bu, çoğunlukla Chrome 29'da desteklenir:

görüntü açıklamasını buraya girin

Şimdi ihtiyacım olan şey , kullanıcının giriş kutusuna girdiği "ham" değeri okuma yeteneğidir . Kullanıcı bir sayı girdiyse:

görüntü açıklamasını buraya girin

o zaman edQuantity.value = 4ve her şey yolunda.

Ancak kullanıcı geçersiz metin girerse, giriş kutusunu kırmızıya boyamak istiyorum:

görüntü açıklamasını buraya girin

Ne yazık ki, bir type="number"giriş kutusu için, metin kutusundaki değer bir sayı değilse value, boş bir dize döndürür:

edQuantity.value = "" (String);

(en azından Chrome 29'da)

Bir kontrolün "ham" değerini nasıl alabilirim <input type="number">?

Chrome'un giriş kutusunun diğer özelliklerinin listesine bakmayı denedim:

görüntü açıklamasını buraya girin

gerçek girdiye benzeyen hiçbir şey görmedim.

Kutunun "boş" olup olmadığını anlamanın bir yolunu da bulamadım. Belki şu sonuca varabilirdim:

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

Not : Yatay kuraldan sonraki her şeyi göz ardı edebilirsiniz; sadece soruyu haklı çıkarmak için doldurucu. Ayrıca: örneği soruyla karıştırmayın. İnsanlar bu sorunun cevabını kutuyu kırmızıya boyamaktan başka nedenlerle isteyebilirler (Bir örnek: onBlur olayı sırasında metni "four"latin "4"sembolüne dönüştürmek )

Bir kontrolün "ham" değerini nasıl alabilirim <input type="number">?

Bonus Okuma


2
Sayısal bir giriş alanının 'gerçek' değeri bir sayı olmalıdır. Sayısal değerlerden başka girdilere izin vermek numberistiyorsanız, aradığınız girdi türü bu değildir; normal bir textgiriş kullanın .
robertc

7
@robertc Chrome, sayılardan başka girdilere izin veren aracıdır; sayılardan başka şeyler de girdiklerini bilmem gerekiyor .
Ian Boyd

1
Alanın validitydurumunu kontrol edin - bekliyorum typeMismatchama kendimi kontrol etmedim.
robertc

2
@ int32_t Altıncı satırı aşağı oku (ör. "Ama eğer kullanıcı girerse ..." )
Ian Boyd

6
Kullanım durumum ... İki sayısal alanım var: enlem ve boylam. Birinin "lat, lon" yapıp yapmadığını tespit etmek ve uygun şekilde davranmak istiyorum. Şu anda type = "number" ile bu imkansızdır. "enlem, boylam" geçersiz olduğundan .. bir normal ifade gerçekleştirmek için "ham" değeri elde etmenin bir yolu yoktur. Başka bir kullanım örneği: bir müşteri hatası görüntüleme: " blahgeçersiz bir sayıdır".
Brad Kent

Yanıtlar:


55

WHATWG'ye göre , geçerli sayısal giriş olmadığı sürece değeri alamamanız gerekir. Giriş numarası alanının temizleme algoritması, giriş geçerli bir kayan nokta sayısı değilse tarayıcının değeri boş bir dizeye ayarlaması gerektiğini söyler.

Değer sanitization algoritması aşağıdaki gibidir: Eğer değer elemanın bir değil geçerli kayan noktalı sayı sonra yerine boş bir dizeye ayarlayın.

Türü ( <input type="number">) belirterek, tarayıcıdan sizin için bazı işler yapmasını istersiniz. Öte yandan, sayısal olmayan girdiyi yakalayabilmek ve onunla bir şeyler yapmak istiyorsanız, eski denenmiş ve doğru metin giriş alanına güvenmeniz ve içeriği kendiniz ayrıştırmanız gerekir.

W3 aynı özeliklere sahip ve ekler:

Kullanıcı aracıları, kullanıcının değeri geçerli bir kayan noktalı sayı olmayan boş olmayan bir dizeye ayarlamasına izin vermemelidir.


6
Kullanıcı aracılarının, kullanıcının değeri geçerli bir kayan noktalı sayı olmayan boş olmayan bir dizeye ayarlamasına izin vermemesi yararlı olacaktır. Ama whatwg yapılamaz diyorsa; o zaman cevap budur. Mevcut ihtiyacım için geçici çözüm aşağıda eklendi.
Ian Boyd

57
Türü ( <input type="number">) belirterek, tarayıcıdan sizin için bazı işler yapmasını istersiniz. Şahsen ben sadece mobil tarayıcılardan sayısal bir tuş takımı göstermelerini istiyordum ve hoş olmayan bir ekstra olarak doğrulamayı aldım. Bu sorunların çoğu, typeözniteliğin hem doğrulama kurallarını hem de hangi giriş mekanizmasının görüntüleneceği ile ilgili kuralları belirlediği gerçeğinden kaynaklanmaktadır , ancak masaüstü kullanıcılarına da numara doğrulamasının uygulanmasını istemeden mobil kullanıcılara sayısal bir klavye göstermeyi istemek oldukça olasıdır. HTML 5.1 en azından bu sorunu eninde sonunda inputmodeöznitelikle çözecektir .
Mark Amery

4
ancak tarayıcı yeterince yapmadığında, onu tamamlayabilmeyi isterim. örneğin girdideki boşlukları kaldırmak, ondalık noktayı çıkarmak gibi ...
njzk2

1
ayrıca fransızca gibi çeşitli dillerde sayı için 2 kelime vardır. biri kredi kartı numaraları gibi tanımlayıcılar olarak sayılar için, diğeri ise kayan noktalı sayılar gibi sayıları saymak için.
njzk2

1
@MotiKorets, iPhone'lar klavyeye ondalık nokta koymadığından kayan nokta sayılarını girmek için çalışmaz. Maalesef geliştiriciler, güzel bir kayan noktalı giriş UX sağlama konusunda oldukça mahvoldu ...
Andy

50

Soruyu cevaplamıyor, ancak faydalı çözüm kontrol etmektir.

edQuantity.validity.valid

ValidityStateBir nesnenin kullanıcı yazdıklarınızın hakkında ipuçları verir. Ve setli bir type="number"giriş düşününminmax

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

Biz her zaman kullanmak istiyorum .validity.valid.

Diğer mülkler yalnızca bonus bilgileri verir:

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

Kullanmadan önce tarayıcının HTML5 doğrulamasını desteklediğinden emin olmanız gerekir:

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

Bonus

Spudly'nin sildiği faydalı bir cevabı var:

Bunun için CSS :invalidseçiciyi kullanın .

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

Bu, sayısal olmayan bir geçerli girildiğinde öğenizin kırmızıya dönmesini tetikleyecektir.

İçin tarayıcı desteği <input type='number'>yaklaşık olarak aynıdır :invalid, bu yüzden orada sorun yok.

:invalid Buradan daha fazlasını okuyun .


Opera'da çalışmıyor. Bir dize girseniz bile geçerli diyor .
Bergi

Opera .validityözelliği destekliyor , ancak doğru şekilde işlemiyor .validmu?
Ian Boyd

Öyle, ama bir sayı girişi ne zaman geçersizdir ? Giriş boşmuş gibi davranır. A typeMismatchmantıklı olabilir, ancak bu yalnızca e-posta veya url türleri içindir…
Bergi

@Bergi Yukarıdaki tablo, sayı girişlerinin geçersiz olabileceği örnekler verir: "q", "11" (bu durumda maksimum 10'dur), "0" (min 1 olduğunda), "" (bu durumda öğe olur required)
Ian Boyd

1
@Bergi 11/20/2012 .badInputeklendi . Ancak badInputgirdinin geçerli olup olmadığını görmek için kimse bakmamalıdır; bakıyor olmalılar .valid. .badInputYanlış olması ve yine de geçersiz girdiye sahip olması mümkündür (ve doğrudur) . .validherhangi bir doğrulama hatasının (ör. uyumsuzluklar, taşmalar, yetersizlikler) bulunmaması olarak tanımlanır ve bunlardan .badInputyalnızca bir tür hata vardır. .badInputYanlış olan yukarıdaki grafiğe dikkat edin , ancak giriş yine de geçersizdir.
Ian Boyd


4

Tüm basılan tuşları anahtar kodlarına göre takip edin

Sanırım biri anahtar olaylarını dinleyebilir ve anahtar kodlarına göre girilen tüm karakterlerin bir dizisini tutabilir. Ama bu oldukça sıkıcı bir görev ve muhtemelen hatalara yatkın.

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

Girişi seçin ve seçimi bir dize olarak alın

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

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

Tüm kredi: int32_t


Bu çözüm başka yerde denendi ve işe yaramıyor . Özellikle kullanıcıların presler Delete, Backspace, Ctrl+X, Ctrl+V, Right-click-cut, Right-click-paste.
Ian Boyd

Size katılıyorum, temelde OP'nin sorduğu şey mümkün değil. Ancak, bahsettiğim her iki hack de (ve bunlar hack, bunu inkar etmiyorum) bir dereceye kadar işe yarıyor. Belki bazı durumlarda birileri için yararlı olabilirler?
sandstrom

şaşırtıcı bir şekilde, seçim işi işe yarıyor gibi görünüyor. Bu yöntemin sınırlamaları nelerdir?
njzk2

Sınırlamalar: metin görsel olarak seçilir. Kullanıcı bir şey
yazarsa

Bu yöntemin ne kadar kötü olduğunu gösteren canlı bir demo ile düzenlendi
vsync
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.