HTML metin girişi yalnızca sayısal girişe izin verir


852

Bir HTML metin girişini ( <input type=text />) yalnızca sayısal tuş vuruşlarına (artı '.') İzin verecek şekilde ayarlamanın hızlı bir yolu var mı ?


81
Buradaki birçok çözüm yalnızca tuşlara basıldığında çalışır. Kullanıcılar menüyü kullanarak metin yapıştırırsa veya metni metin girişine sürükleyip bırakırlarsa başarısız olurlar. Daha önce bundan ısırıldım. Dikkatli ol!
Bennett McElwee

83
@JuliusA - her zaman her zaman sunucu tarafı doğrulamasına ihtiyacınız vardır.
Stephen P

46
<input type="text" onkeypress='return event.charCode >= 48 && event.charCode <= 57'></input>
Droogans

14
@Droogans, TAB gibi başka bir anahtarın bir sonraki girişe gitmesini veya giriş odaklanmışsa web sitesini yenilemek için cmd + R gibi girişlerle doğrudan ilgili olmayan başka bir kısayolu devre dışı bıraktığını fark eder.
Alejandro Pérez

1
Eklenti ile uyumluysanız, NumericInput kullanın. Demo: jsfiddle.net/152sumxu/2 Daha fazla detay burada stackoverflow.com/a/27561763/82961
Faiz

Yanıtlar:


1137

Not: Bu güncellenmiş bir cevaptır. Aşağıdaki yorumlar, kod kodlarıyla uğraşan eski bir sürüme ilişkindir.

JavaScript

JSFiddle'da kendiniz deneyin .

Bir metnin giriş değerlerini <input>aşağıdaki setInputFilterişlevle filtreleyebilirsiniz (Kopyala + Yapıştır, Sürükle + Bırak, klavye kısayolları, bağlam menüsü işlemleri, yazılamaz tuşlar, düzeltme konumu, farklı klavye düzenleri ve IE 9'dan bu yana tüm tarayıcıları destekler ) :

// Restricts input for the given textbox to the given inputFilter function.
function setInputFilter(textbox, inputFilter) {
  ["input", "keydown", "keyup", "mousedown", "mouseup", "select", "contextmenu", "drop"].forEach(function(event) {
    textbox.addEventListener(event, function() {
      if (inputFilter(this.value)) {
        this.oldValue = this.value;
        this.oldSelectionStart = this.selectionStart;
        this.oldSelectionEnd = this.selectionEnd;
      } else if (this.hasOwnProperty("oldValue")) {
        this.value = this.oldValue;
        this.setSelectionRange(this.oldSelectionStart, this.oldSelectionEnd);
      } else {
        this.value = "";
      }
    });
  });
}

Artık setInputFilterbir giriş filtresi kurmak için bu işlevi kullanabilirsiniz :

setInputFilter(document.getElementById("myTextBox"), function(value) {
  return /^\d*\.?\d*$/.test(value); // Allow digits and '.' only, using a RegExp
});

Daha fazla giriş filtresi örneği için JSFiddle demosuna bakın . Ayrıca yine de sunucu tarafı doğrulaması yapmanız gerektiğini unutmayın !

daktilo ile yazılmış yazı

İşte bunun bir TypeScript sürümü.

function setInputFilter(textbox: Element, inputFilter: (value: string) => boolean): void {
    ["input", "keydown", "keyup", "mousedown", "mouseup", "select", "contextmenu", "drop"].forEach(function(event) {
        textbox.addEventListener(event, function(this: (HTMLInputElement | HTMLTextAreaElement) & {oldValue: string; oldSelectionStart: number | null, oldSelectionEnd: number | null}) {
            if (inputFilter(this.value)) {
                this.oldValue = this.value;
                this.oldSelectionStart = this.selectionStart;
                this.oldSelectionEnd = this.selectionEnd;
            } else if (Object.prototype.hasOwnProperty.call(this, 'oldValue')) {
                this.value = this.oldValue;
                if (this.oldSelectionStart !== null &&
                    this.oldSelectionEnd !== null) {
                    this.setSelectionRange(this.oldSelectionStart, this.oldSelectionEnd);
                }
            } else {
                this.value = "";
            }
        });
    });
}

jQuery

Bunun jQuery sürümü de var. Bu cevaba bakın .

HTML 5

HTML 5'in yerel bir çözümü vardır <input type="number">( teknik özelliklere bakın ), ancak tarayıcı desteğinin değişiklik gösterdiğine dikkat edin:

  • Çoğu tarayıcı girdiyi yalnızca formu gönderirken doğrular, yazarken doğrulamaz.
  • Çoğu mobil tarayıcı desteklemez step, minve maxniteliklerini.
  • Krom (sürüm 71.0.3578.98) hala kullanıcı karakterleri girmek için izin verir eve Ealana. Ayrıca bu soruya bakın .
  • Firefox (sürüm 64.0) ve Edge (EdgeHTML sürüm 17.17134), kullanıcının yine de alana herhangi bir metin girmesine izin verir .

W3schools.com adresinde kendiniz deneyin .


4
Bu iyi bir seçim olsa da, bu hala /, çoklu noktalar, diğer operatörler vb. Gibi karakterlerin girilmesine izin verir
Mahendra Liya

6
Firefox 21 tarafından hala desteklenmiyor (IE9 veya önceki sürümlerden bahsetmiyorum bile ...)
JBE

67
Giriş türü numarası, girişinizin yalnızca sayı kabul etmesini sağlamak için kullanılmaz. Bir 'öğe sayısı' belirten girişler içindir. Örneğin Chrome, sayıyı birer birer azaltmak için iki küçük ok ekler. Sadece sayıca uygun bir girdi, HTML'ye bir tür gülünç ihmaldir.
Erwin

9
Type = "number", alana geçersiz metin girilmesini engellemez; çöp verilerini tarlada, hatta kromda bile kesip yapıştırabileceğiniz görünür.
mükemmeliyetçi

6
Buna ekleyeceğim tek şey, Ctrl + A satırını MacOSX kullanıcılarını içerecek şekilde değiştirmektir:(e.keyCode == 65 && (e.ctrlKey === true || e.metaKey === true))
MForMarlon

281

Bu DOM'u kullan

<input type='text' onkeypress='validate(event)' />

Ve bu senaryo

function validate(evt) {
  var theEvent = evt || window.event;

  // Handle paste
  if (theEvent.type === 'paste') {
      key = event.clipboardData.getData('text/plain');
  } else {
  // Handle key press
      var key = theEvent.keyCode || theEvent.which;
      key = String.fromCharCode(key);
  }
  var regex = /[0-9]|\./;
  if( !regex.test(key) ) {
    theEvent.returnValue = false;
    if(theEvent.preventDefault) theEvent.preventDefault();
  }
}

12
eeepc 900'deki german-settings. iyi kullanılabilirlik için bazı anahtarlar çalışmıyor: - geri tuşu (keyCode: 8) - sol ve sağ gezinme tuşu (keyCode: 37, 38) kopyala ve yapıştır da mümkündür ...
Michael Piendl

11
Çoğu kişi umursuyor, bir komut dosyası hatası gösterilmesi sitenize kötü yansıtıyor.
Robert Jeppesen

14
Bu kodla ilgili birkaç sorun var. Girebilirsin . birden fazla kez, ikinci silme tuşuna izin vermez, herhangi bir çözüm?
coure2011

4
Backspace, delete ve okların çalışmamasına dikkat ettim. "TheEvent.keycode ||" öğesini kaldırır ve şunu eklerseniz: "if (/ [- ~] / &&! Regex.test (key)) {" daha iyi çalışır (yine de ASCII / UTF için). Ama sonra çince karakterleri reddetmeyecek! :)
Sam Watkins

4
Bu, birinin girişe rastgele şeyler yapıştırmasına izin verir
Vitim.us

137

Buna iyi bir cevap bulmak için uzun ve zor aradım ve umutsuzca ihtiyacımız var <input type="number", ancak kısaca, bu 2, ortaya çıkabilecek en kısa yollardır:

<input type="text" 
       onkeyup="this.value=this.value.replace(/[^\d]/,'')">

Eğer silinmeden önce bir saniyeliğine gösterilen kabul edilmeyen karakterden hoşlanmıyorsanız, aşağıdaki yöntem benim çözümümdür. Çok sayıda ek koşula dikkat edin, bu her türlü gezinme ve kısayol tuşunu devre dışı bırakmaktan kaçınmak içindir. Bunu nasıl kompaktifleştireceğini bilen biri varsa, bize bildirin!

<input type="text" 
onkeydown="return ( event.ctrlKey || event.altKey 
                    || (47<event.keyCode && event.keyCode<58 && event.shiftKey==false) 
                    || (95<event.keyCode && event.keyCode<106)
                    || (event.keyCode==8) || (event.keyCode==9) 
                    || (event.keyCode>34 && event.keyCode<40) 
                    || (event.keyCode==46) )">

4
input type = "number" HTML 5'te geliyor - ve JavaScript'i geri dönüşlü çoklu dolgu
Fenton

5
İyi bir yöntem ama kabul edilemez bir tuşa basılarak basılı tutulabilir
Scott Brown

8
/[^\d+]/
Normal ifadeyi

11
@boecko bunun için teşekkürler, ama /[^\d]+/bunun yerine olması gerektiğini unutmayın . Gerçi iyi bir çözüm. Ayrıca @ user235859
Mosselman

11
O da izin vermek istedi .. Aslında yapmalısınız/[^0-9.]/g
Qsario

93

İşte tam olarak bir ondalık sayıya izin veren basit, ancak daha fazla değil:

<input type="text" oninput="this.value = this.value.replace(/[^0-9.]/g, '').replace(/(\..*)\./g, '$1');" />


12
Kolları: kopyala + yapıştır, sürükle ve bırak, sadece 1 ondalık sayı, sekme, silme, geri al tuşu - bunu kullan
Mathemats

Giriş içerisindeki bu mantık global olarak kullanılabilecek şekilde çıkarılabilir mi?
ema

@ema - evet, kuralı sınıfı kullanarak nasıl uygulayabileceğinizi gösteren diğer cevabımı burada görebilirsiniz.
billynoah

bunu açısal formda kullanırsanız, form denetim değerinde değer güncelleştirilmez.
Ale_info

Muhteşem. Olayı this.value = this.value.replace (/ [^ 0-9 .-] / g, '') .replace (/(\..*)\./ g, '$ 1') olarak değiştiriyorum. değiştirin (/ ^ 0 + / g, ''). değiştirin (/ (? <! ^) - / g, ''); Bu şekilde başlangıçta yalnızca a'yı işler ve sayının başında 0'a izin vermez.
Temmuz'da

54

Ve benim için harika çalışan bir örnek daha:

function validateNumber(event) {
    var key = window.event ? event.keyCode : event.which;
    if (event.keyCode === 8 || event.keyCode === 46) {
        return true;
    } else if ( key < 48 || key > 57 ) {
        return false;
    } else {
        return true;
    }
};

Ayrıca tuşa basma etkinliğine ekle

$(document).ready(function(){
    $('[id^=edit]').keypress(validateNumber);
});

Ve HTML:

<input type="input" id="edit1" value="0" size="5" maxlength="5" />

İşte bir jsFiddle örneği


Yapıştırılan metin ne olacak?
Jason Ebersey

Bu işlevi çağırdığımda neden "olay tanımsız" oluyor?
Vincent

1
event.keyCode her zaman 0 döndürüldüğünde bu Firefox'ta çalışmaz. Yeni kodla düzelttim: function validateNumber (event) {var key = event.which || event.charCode || event.keyCode || 0; if (anahtar == 8 || anahtar == 46 || anahtar == 37 || anahtar == 39) {return true; } else if (anahtar <48 || anahtar> 57) {dönüş yanlış; } gerçek dön; };
Luan Nguyen

1
@ Jessica'nın dediği gibi, kesme işareti ve hatta yüzde işareti eklemek cam.
Alejandro Nava

1
Çok yakın! ancak birden fazla ondalık sayıya izin verir.
kross

52

HTML5 <input type=number>size uygun geliyor. Şu anda yalnızca Opera yerel olarak desteklemektedir, ancak JavaScript uygulaması olan bir proje vardır.


İşte hangi tarayıcıların bu özelliği desteklediğini tanımlayan bir belge: caniuse.com/input-number . Bunun yazılmasından sonra, Chrome ve Safari bu tür alanları tam olarak desteklemektedir. IE 10'un kısmi desteği vardır ve Firefox'un desteği yoktur.
Nathan Wallace

Tek sorun type=numberIE9 tarafından desteklenmiyor
J Rod

@JRod bir var polyfill eski IE için. Daha fazla bilgi burada .
jkdev

6
İlk sorun karaktere type=numberizin evermektir, çünkü e+10sayı olarak kabul edilir. İkinci sorun, girişteki maksimum karakter sayısını sınırlayamamanızdır.
Hakan Fıstık

Başka bir sorun türü sayı ise, o zaman tür, örneğin: "tel" ayarlama faydaları elde edemezsiniz olmasıdır.
ScottyBlades

49

Buradaki yanıtların çoğu, önemli olayları kullanmanın zayıflığına sahiptir .

Cevapların çoğu klavye makroları, kopyalama + yapıştırma ve daha fazla istenmeyen davranış ile metin seçimi yapma yeteneğinizi sınırlar, diğerleri makineli tüfeklerle sinekleri öldüren belirli jQuery eklentilerine bağlı gibi görünüyor.

Bu basit çözüm, giriş mekanizmasından (tuş vuruşu, kopyala + yapıştır, sağ tıkla kopyala + yapıştır, konuşmadan metne vb.) Bağımsız olarak benim için çapraz platform için en iyi şekilde çalışıyor gibi görünüyor. Tüm metin seçimi klavye makroları yine de çalışır ve komut dosyasıyla sayısal olmayan bir değer ayarlama yeteneğini bile sınırlar.

function forceNumeric(){
    var $input = $(this);
    $input.val($input.val().replace(/[^\d]+/g,''));
}
$('body').on('propertychange input', 'input[type="number"]', forceNumeric);

jQuery 1.7+ gerekir. Bu, "kopya" yoluyla hesap girişlerini aldığından daha eksiksiz bir yanıttır. Ve ayrıca daha basit!
Memochipan

Alternatif bir normal ifade: replace(/[^\d]+/g,'')Rakam olmayan tüm karakterleri boş dize ile değiştirin. "İ" (büyük / küçük harf duyarsız) değiştirici gerekli değildir.
Memochipan

Bir etiketteki "onkey" olay işleyicileri artık yayılmaması gerektiğinden, bu üstte olmalıdır ...
gpinkas

Bu kesinlikle en iyi cevaptır, ancak ondalık sayılara sahip basamaklara izin vermez. Bunun nasıl çalışabileceği hakkında bir fikrin var mı?
Atirag

6
@Atirag Ondalık basamaklar istiyorsanız normal ifadeyi değiştirebilirsiniz/[^\d,.]+/
EJTH

41

Burada belirtilen iki cevabın bir kombinasyonunu kullanmayı seçtim yani

<input type="number" />

ve

function isNumberKey(evt){
    var charCode = (evt.which) ? evt.which : evt.keyCode
    return !(charCode > 31 && (charCode < 48 || charCode > 57));
}

<input type="text" onkeypress="return isNumberKey(event);">


Mükemmel cevap ... +1. İf ifadesini şu şekilde de azaltabilirsiniz: return !(charCode > 31 && (charCode < 48 || charCode > 57));
schadeck

7
Yine de silmeye ne dersiniz? Rakamlar istiyorsunuz, ancak muhtemelen insanların sayfayı yenilemeden düzeltebilmelerini istiyorsunuz ...
Martin Erlic

40

HTML5 normal ifadeleri destekler, böylece bunu kullanabilirsiniz:

<input id="numbersOnly" pattern="[0-9.]+" type="text">

Uyarı: Bazı tarayıcılar henüz bunu desteklemiyor.


7
HTML5 de vardır <input type=number>.
Mathias Bynens

Doğru. Bunu bir cevap yapmalısın. Ooops, @ Ms2ger zaten var.
james.garriss

<İnput type = number>, belirli tarayıcılarda artan ve azalan oklar eklediğinden, döndürücüden kaçınmak istediğimizde bu iyi bir çözüm gibi görünüyor
Ayrad

35
Desen yalnızca gönderildiğinde kontrol edilir. Yine de harf girebilirsiniz.
Erwin

+Kalıp özelliğindeki araçlar ne anlama geliyor?
PlanetHackers

18

JavaScript

function validateNumber(evt) {
    var e = evt || window.event;
    var key = e.keyCode || e.which;

    if (!e.shiftKey && !e.altKey && !e.ctrlKey &&
    // numbers   
    key >= 48 && key <= 57 ||
    // Numeric keypad
    key >= 96 && key <= 105 ||
    // Backspace and Tab and Enter
    key == 8 || key == 9 || key == 13 ||
    // Home and End
    key == 35 || key == 36 ||
    // left and right arrows
    key == 37 || key == 39 ||
    // Del and Ins
    key == 46 || key == 45) {
        // input is VALID
    }
    else {
        // input is INVALID
        e.returnValue = false;
        if (e.preventDefault) e.preventDefault();
    }
}

ek olarak virgül, nokta ve eksi (, .-) ekleyebilirsiniz

  // comma, period and minus, . on keypad
  key == 190 || key == 188 || key == 109 || key == 110 ||

HTML

<input type="text" onkeydown="validateNumber(event);"/ >

Bir kişinin sayı girmek için shift tuşunu kullanması gereken klavyelerde düzgün çalışmaz (örn. Avrupa AZERTY klavye).
Kaptan Mantıklı

teşekkürler dostum, gerçekten bir soru anlıyorsun! Güzel bir örnek ve rota dışı kullanım. veya (çoğu insan sayılarla çalışırlarsa ister)
real_yggdrasil

Bu, sayısal olmayan değerlerin yapıştırılmasını önleyen yalnızca çalışanıdır.
DEREK LEE

16

Çok basit....

// Bir JavaScript işlevinde (HTML veya PHP kullanabilir).

function isNumberKey(evt){
    var charCode = (evt.which) ? evt.which : evt.keyCode;
    if (charCode > 31 && (charCode < 48 || charCode > 57))
        return false;
    return true;
}

Form girişinizde:

<input type=text name=form_number size=20 maxlength=12 onkeypress='return isNumberKey(event)'>

Giriş maks. (Yukarıda belirtilenler 12 basamaklı bir sayıya izin verir)


Yapma bunu! Bu, her şeyi, sayısal tuş takımını, ok tuşlarını, Sil tuşunu, kısayolları (örneğin CTRL + A, CTRL + R), hatta TAB tuşunu bile REALY anoying!
Korri

@Korri Takip etmiyorum, problme ne görünüyor? Benim durumumda iyi çalıştı.
uneakharsh

ilk satır şu şekilde değiştirilmelidir:var charCode = (evt.which) ? evt.which : evt.keyCode;
peiman F.

15

2 çözüm:

Form doğrulayıcı kullanın (örneğin jQuery doğrulama eklentisi ile) )

Giriş alanının onblur (yani kullanıcı alandan ayrıldığında) olayı sırasında, normal ifadeyle bir kontrol yapın:

<script type="text/javascript">
function testField(field) {
    var regExpr = new RegExp("^\d*\.?\d*$");
    if (!regExpr.test(field.value)) {
      // Case of error
      field.value = "";
    }
}

</script>

<input type="text" ... onblur="testField(this);"/>

İlginçtir ki, normal ifadeyi "^ \\ d \\.? \\ d * $" olarak vermek zorunda kaldım, ancak bunun nedeni sayfanın bir XSLT dönüşümüyle çalıştırılmış olması olabilir.
Paul Tomblin

Bence düzenli ifade yanlış. Bu satırı kullandım:var regExpr = /^\d+(\.\d*)?$/;
costa

@costa emin değil, kullanıcı örneğin .123(yerine 0.123) girmek istiyorsa ?
Romain Linsolas

@romaintaz. Haklısınız, ancak noktanın önünde rakam olmaması durumunda noktadan sonra rakamların olduğundan emin olmak için normal ifadeyi değiştirmeniz gerekir. Böyle bir şey: var regExpr = /^\d+(\.\d*)?$|^\.\d+$/;.
Kosta

14

Daha güvenli bir yaklaşım, tuş basışlarını ele geçirmek ve keyCodes'ı filtrelemeye çalışmak yerine girişin değerini kontrol etmektir.

Bu şekilde kullanıcı klavye oklarını, değiştirici tuşlarını, geri almayı, silme, standart olmayan keyboarları kullanma, yapıştırmak için fareyi kullanma, metni sürükleyip bırakma, hatta erişilebilirlik girişlerini kullanmada serbesttir.

Aşağıdaki komut dosyası pozitif ve negatif sayılara izin verir

1
10
100.0
100.01
-1
-1.0
-10.00
1.0.0 //not allowed

var input = document.getElementById('number');
input.onkeyup = input.onchange = enforceFloat;

//enforce that only a float can be inputed
function enforceFloat() {
  var valid = /^\-?\d+\.\d*$|^\-?[\d]*$/;
  var number = /\-\d+\.\d*|\-[\d]*|[\d]+\.[\d]*|[\d]+/;
  if (!valid.test(this.value)) {
    var n = this.value.match(number);
    this.value = n ? n[0] : '';
  }
}
<input id="number" value="-3.1415" placeholder="Type a number" autofocus>

DÜZENLEME: Eski cevabımı kaldırdım çünkü sanırım şimdi eskidir.


Bu gerçekten de çoğu vakayı kapsamaktadır
Zia Ul Rehman Mughal


13

Lütfen aşağıda belirtilen çözümü bulun. Bu kullanıcının sadece girebilecek olabilir yılında numericdeğeri, aynı zamanda kullanıcı muktedir olamaz copy, paste, dragve dropgirişteki.

İzin Verilen Karakterler

0,1,2,3,4,5,6,7,8,9

Etkinliklerde Karakterlere ve Karakterlere izin verilmiyor

  • Alfabetik değer
  • Özel karakterler
  • kopya
  • Yapıştırmak
  • Sürüklemek
  • Düşürmek

$(document).ready(function() {
  $('#number').bind("cut copy paste drag drop", function(e) {
      e.preventDefault();
  });     
});
function isNumberKey(evt) {
    var charCode = (evt.which) ? evt.which : evt.keyCode;
    if (charCode > 31 && (charCode < 48 || charCode > 57))
        return false;
    return true;
}
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<input type="text" class="form-control" name="number" id="number" onkeypress="return isNumberKey(event)" placeholder="Enter Numeric value only">

Çalışmıyorsa bana bildirin.


11

Alete (belki bir cep telefonuna) alfa veya sayısal arasında önermek isterseniz kullanabilirsiniz <input type="number">.


11

Bir örnek daha nerede olabilir , giriş alanına sadece sayı eklemek olamaz harfler

<input type="text" class="form-control" id="phone" name="phone" placeholder="PHONE" spellcheck="false" oninput="this.value = this.value.replace(/[^0-9.]/g, '').replace(/(\..*)\./g, '$1');">

10

Event.keyCode veya event.whike yerine jQuery ve replace () kullanarak kısa ve tatlı bir uygulama:

$('input.numeric').live('keyup', function(e) {
  $(this).val($(this).val().replace(/[^0-9]/g, ''));
});

Yazılan harfin anlık olarak görünmesi ve CTRL / CMD + A'nın biraz garip davranması gibi sadece küçük bir yan etki.


9

input type="number" bir HTML5 özelliğidir.

Diğer durumda bu size yardımcı olacaktır:

function isNumberKey(evt){
    var charCode = (evt.which) ? evt.which : evt.keyCode
    if (charCode > 31 && (charCode < 48 || charCode > 57))
        return false;
    return true;
}

<input type="number" name="somecode" onkeypress="return isNumberKey(event)"/>

ilk satır şu şekilde değiştirilmelidir:var charCode = (evt.which) ? evt.which : evt.keyCode;
peiman F.

9

JavaScript kodu:

function validate(evt)
{
    if(evt.keyCode!=8)
    {
        var theEvent = evt || window.event;
        var key = theEvent.keyCode || theEvent.which;
        key = String.fromCharCode(key);
        var regex = /[0-9]|\./;
        if (!regex.test(key))
        {
            theEvent.returnValue = false;

            if (theEvent.preventDefault)
                theEvent.preventDefault();
            }
        }
    }

HTML Kodu:

<input type='text' name='price' value='0' onkeypress='validate(event)'/>

backspace anahtar kodu 8 olduğundan ve normal ifade ifadesi izin vermediğinden mükemmel çalışır, bu nedenle hatayı atlamanın kolay bir yoludur :)


9

Bu sorunu çözmenin kolay bir yolu, metin kutusuna yazılan karakterlerin normal ifadesiyle doğrulamak için bir jQuery işlevi uygulamaktır:

Html kodunuz:

<input class="integerInput" type="text">

Ve jQ işlevi jQuery kullanarak

$(function() {
    $('.integerInput').on('input', function() {
      this.value = this.value
        .replace(/[^\d]/g, '');// numbers and decimals only

    });
});

$(function() {
        $('.integerInput').on('input', function() {
          this.value = this.value
            .replace(/[^\d]/g, '');// numbers and decimals only
            
        });
    });
<script
			  src="https://code.jquery.com/jquery-2.2.4.min.js"
			  integrity="sha256-BbhdlvQf/xTY9gja0Dq3HiwQF8LaCRTXxZKRutelT44="
			  crossorigin="anonymous">
</script>

<input type="text" class="integerInput"/>


		


8

JQuery kullanarak sadece bir başka varyant

$(".numeric").keypress(function() {
    return (/\d/.test(String.fromCharCode(event.which) ))
});

8

sadece type = "number" kullanın, bu özellik tarayıcıların çoğunda destekleniyor

<input type="number" maxlength="3" ng-bind="first">

Verileri kontrol etmedim --1(1'den önce 2 eksi karakter).
Ngoc Nam

6

Ayrıca, giriş değerini (varsayılan olarak dize olarak kabul edilir) kendisiyle sayısal olarak zorlayarak karşılaştırabilirsiniz, örneğin:

if(event.target.value == event.target.value * 1) {
    // returns true if input value is numeric string
}

Ancak, bunu keyup vb. Gibi olaylara bağlamanız gerekir.


6
<input name="amount" type="text" value="Only number in here"/> 

<script>
    $('input[name=amount]').keyup(function(){
        $(this).val($(this).val().replace(/[^\d]/,''));
    });
</script>

6

Bazı harika cevaplar gördüm, ancak onları olabildiğince küçük ve olabildiğince basit buluyorum, belki biri bundan faydalanacak. Javascript Number()ve isNaNböyle bir işlevsellik kullanırsınız :

if(isNaN(Number(str))) {
   // ... Exception it is NOT a number
} else {
   // ... Do something you have a number
}

Bu yardımcı olur umarım.


1
Bunu seviyorum! Böyle zarif bir çözüm, regex dahil değil.
Levi Roberts

Bu soruya bir cevap değildir, OP daha sonra doğrulamak için değil, sadece bir girişte metne izin vermesini istedi.
Timberman

Evet, gerçek bu! Ama zaten iyi olduğunu düşündüğüm kabul edilmiş bir cevap var, ama bunun birisine yardımcı olabileceğini düşündüm, artı güzel ve temiz.
Sicha

5

Bu DOM'u kullanın:

<input type = "text" onkeydown = "validate(event)"/>

Ve bu senaryo:

validate = function(evt)
{
    if ([8, 46, 37, 39, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 35, 36].indexOf(evt.keyCode || evt.which) == -1)
    {
        evt.returnValue = false;
        if(evt.preventDefault){evt.preventDefault();}
    }
}

... VEYA bu script, indexOf olmadan, iki kullanarak for...

validate = function(evt)
{
    var CharValidate = new Array("08", "046", "039", "948", "235");
    var number_pressed = false;
    for (i = 0; i < 5; i++)
    {
        for (Ncount = 0; Ncount < parseInt(CharValidate[i].substring(0, 1)) + 1; Ncount++)
        {
            if ((evt.keyCode || evt.which) == parseInt(CharValidate[i].substring(1, CharValidate[i].lenght)) + Ncount)
            {
                number_pressed = true;
            }
        }
    }
    if (number_pressed == false)
    {
        evt.returnValue = false;
        if(evt.preventDefault){evt.preventDefault();}
    }
}

Onkeypress özniteliğinden önce onkeydown özniteliği kontrol edildiğinden onkeypress yerine onkeydown özniteliğini kullandım. Sorun Google Chrome tarayıcısında olabilir.

"Onkeypress" özelliğiyle TAB, google chrome'daki "preventDefault" ile kontrol edilemez, ancak "onkeydown" özelliğiyle TAB kontrol edilebilir hale gelir!

SEKME için ASCII Kodu => 9

İlk komut dosyasının ikincisinden daha az kodu vardır, ancak ASCII karakter dizisi tüm anahtarlara sahip olmalıdır.

İkinci komut dosyası birinciden çok daha büyüktür, ancak dizinin tüm anahtarlara ihtiyacı yoktur. Dizinin her bir konumundaki ilk basamak, her bir konumun kaç kez okunacağıdır. Her okuma için, bir sonraki okumaya 1 artırılacaktır. Örneğin:




NCount = 0

48 + NCount = 48

NCount + +

48 + NCount = 49

NCount + +

...

48 + NCount = 57




Sayısal tuşlar yalnızca 10 (0 - 9) olduğunda, ancak 1 milyon olsaydı, tüm bu tuşlarla bir dizi oluşturmak mantıklı olmazdı.

ASCII kodları:

  • 8 ==> (Geri silme);
  • 46 => (Sil);
  • 37 => (sol ok);
  • 39 => (sağ ok);
  • 48-57 => (sayılar);
  • 36 => (ev);
  • 35 => (son);

5

Bu geliştirilmiş bir işlevdir:

function validateNumber(evt) {
  var theEvent = evt || window.event;
  var key = theEvent.keyCode || theEvent.which;
  if ((key < 48 || key > 57) && !(key == 8 || key == 9 || key == 13 || key == 37 || key == 39 || key == 46) ){
    theEvent.returnValue = false;
    if (theEvent.preventDefault) theEvent.preventDefault();
  }
}

4

En iyi yol (TÜM sayı türlerine izin verin - gerçek negatif, gerçek pozitif, iinteger negatif, tamsayı pozitif):

$(input).keypress(function (evt){
    var theEvent = evt || window.event;
    var key = theEvent.keyCode || theEvent.which;
    key = String.fromCharCode( key );
    var regex = /[-\d\.]/; // dowolna liczba (+- ,.) :)
    var objRegex = /^-?\d*[\.]?\d*$/;
    var val = $(evt.target).val();
    if(!regex.test(key) || !objRegex.test(val+key) || 
            !theEvent.keyCode == 46 || !theEvent.keyCode == 8) {
        theEvent.returnValue = false;
        if(theEvent.preventDefault) theEvent.preventDefault();
    };
}); 

4

Bu, geowa4'ün çözümünün genişletilmiş sürümüdür . Destekler minve maxöznitelikler. Sayı aralık dışındaysa, önceki değer gösterilir.

Burada test edebilirsiniz.

Kullanımı: <input type=text class='number' maxlength=3 min=1 max=500>

function number(e) {
var theEvent = e || window.event;
var key = theEvent.keyCode || theEvent.which;
if(key!=13&&key!=9){//allow enter and tab
  key = String.fromCharCode( key );
  var regex = /[0-9]|\./;
  if( !regex.test(key)) {
    theEvent.returnValue = false;
    if(theEvent.preventDefault) theEvent.preventDefault();
    }   
  }
}

$(document).ready(function(){
    $("input[type=text]").filter(".number,.NUMBER").on({
        "focus":function(e){
         $(e.target).data('oldValue',$(e.target).val());
            },
        "keypress":function(e){
                e.target.oldvalue = e.target.value;
                number(e);
            },
        "change":function(e){
            var t = e.target;
            var min = $(t).attr("min");
            var max = $(t).attr("max");
            var val = parseInt($(t).val(),10);          
            if( val<min || max<val)
                {
                    alert("Error!");
                    $(t).val($(t).data('oldValue'));
                }

            }       
    });     
});

Girişler dinamikse bunu kullanın:

$(document).ready(function(){
    $("body").on("focus","input[type=text].number,.NUMBER",function(e){
        $(e.target).data('oldValue',$(e.target).val());
    }); 
    $("body").on("keypress","input[type=text].number,.NUMBER",function(e){
        e.target.oldvalue = e.target.value;
        number(e);
    }); 
    $("body").on("change","input[type=text].number,.NUMBER",function(e){
        var t = e.target
        var min = $(t).attr("min");
        var max = $(t).attr("max");
        var val = parseInt($(t).val());         
        if( val<min || max<val)
            {
                alert("Error!");
                $(t).val($(t).data('oldValue'));
            }
    }); 
});

@UserB bu hiçbir şeyi silmemelidir.
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.