Wprowadzanie tekstu HTML pozwala tylko na wprowadzanie liczbowe

852

Czy istnieje szybki sposób na ustawienie wprowadzania tekstu HTML ( <input type=text />) tak, aby zezwalał tylko na naciśnięcia klawiszy numerycznych (plus „.”)?

Julius A.
źródło
81
Wiele rozwiązań tutaj działa tylko po naciśnięciu klawiszy. Nie powiedzie się to, jeśli ludzie wkleją tekst za pomocą menu lub przeciągną i upuszczą tekst na wprowadzany tekst. Już wcześniej mnie to gryzło. Bądź ostrożny!
Bennett McElwee
83
@JuliusA - zawsze zawsze potrzebujesz weryfikacji po stronie serwera.
Stephen P
46
<input type="text" onkeypress='return event.charCode >= 48 && event.charCode <= 57'></input>
Droogans,
14
@Droogans zauważa, że ​​wyłącza także każdy inny klawisz, np. TAB, aby przejść do następnego wejścia lub inny skrót niezwiązany bezpośrednio z wejściem, taki jak cmd + R, do odświeżania strony, jeśli dane wejściowe są skoncentrowane.
Alejandro Pérez
1
Jeśli nie masz nic przeciwko wtyczce, użyj NumericInput. Demo: jsfiddle.net/152sumxu/2 Więcej informacji tutaj stackoverflow.com/a/27561763/82961
Faiz

Odpowiedzi:

1137

Uwaga: to jest zaktualizowana odpowiedź. Komentarze poniżej odnoszą się do starej wersji pomieszanej z kodami klawiszy.

JavaScript

Wypróbuj sam na JSFiddle .

Możesz filtrować wartości wejściowe tekstu <input>za pomocą następującej setInputFilterfunkcji (obsługuje kopiowanie + wklejanie, przeciąganie + upuszczanie, skróty klawiaturowe, operacje w menu kontekstowym, klawisze niewypełniane, położenie karetki, różne układy klawiatury i wszystkie przeglądarki od wersji IE 9 ) :

// 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 = "";
      }
    });
  });
}

Możesz teraz użyć tej setInputFilterfunkcji, aby zainstalować filtr wejściowy:

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

Zobacz demo JSFiddle, aby uzyskać więcej przykładów filtrów wejściowych. Pamiętaj też, że nadal musisz przeprowadzić weryfikację po stronie serwera!

Maszynopis

Oto jego wersja TypeScript.

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

Istnieje również wersja jQuery. Zobacz tę odpowiedź .

HTML 5

HTML 5 ma natywne rozwiązanie z <input type="number">(patrz specyfikacja ), ale zauważ, że obsługa przeglądarki jest różna:

  • Większość przeglądarek zweryfikuje dane wejściowe tylko podczas przesyłania formularza, a nie podczas pisania.
  • Większość przeglądarek mobilnych nie obsługują step, mini maxatrybuty.
  • Chrome (wersja 71.0.3578.98) nadal pozwala użytkownikowi wprowadzać znaki ei Epole. Zobacz także to pytanie .
  • Firefox (wersja 64.0) i Edge (EdgeHTML wersja 17.17134) nadal pozwalają użytkownikowi wprowadzać dowolny tekst w polu.

Wypróbuj sam na w3schools.com .

emkey08
źródło
4
Chociaż byłby to dobry wybór, nadal pozwala na wprowadzanie znaków takich jak /, wiele kropek, innych operatorów itp.
Mahendra Liya
6
Wciąż nieobsługiwany przez Firefox 21 (nawet nie mówię o IE9 lub wcześniejszej wersji ...)
JBE
67
Numer typu wejścia nie jest przeznaczony do tego, aby wprowadzać tylko liczby. Jest przeznaczony do danych wejściowych, które określają „liczbę elementów”. Na przykład Chrome dodaje dwie małe strzałki, aby zwiększyć lub zmniejszyć liczbę o jeden. Właściwe wprowadzanie tylko liczb jest rodzajem absurdalnego pominięcia w HTML.
Erwin
9
Typ = „liczba” tak naprawdę nie zapobiega wprowadzaniu niepoprawnego tekstu w polu; wygląda na to, że możesz nawet wycinać i wklejać dane śmieci do pola, nawet w chrome.
perfekcjonista
6
Jedyne, co chciałbym do tego dodać, to zmienić linię Ctrl + A, aby uwzględnić użytkowników MacOSX:(e.keyCode == 65 && (e.ctrlKey === true || e.metaKey === true))
MForMarlon
280

Użyj tego DOM

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

I ten skrypt

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();
  }
}
geowa4
źródło
12
niemieckie ustawienia na eeepc 900. niektóre klucze na dobre użytkowanie nie działają: - backspace (keyCode: 8) - klawisz nawigacyjny w lewo i prawo (keyCode: 37, 38) kopiowanie i wklejanie jest również możliwe ...
Michael Piendl
11
Większość ludzi się tym przejmuje, a pojawienie się błędu skryptu źle odzwierciedla witrynę.
Robert Jeppesen
14
kilka problemów z tym kodem. Możesz wejść . więcej niż jeden raz, po drugie, nie pozwala na usunięcie klucza, jakieś rozwiązanie?
coure2011
4
Dbałem o backspace, usuwanie i strzałki nie działające. Jeśli usuniesz „theEvent.keycode ||” i dodasz: „if (/ [- ~] / &&! Regex.test (key)) {”, to i tak działa lepiej (dla ASCII / UTF i tak). Ale wtedy nie odrzuci chińskich znaków! :)
Sam Watkins
4
pozwala to komuś wkleić losowe rzeczy na wejściu
Vitim.us
136

Długo i ciężko szukałem dobrej odpowiedzi na to pytanie i rozpaczliwie potrzebujemy <input type="number", ale poza tym te 2 są najbardziej zwięzłymi sposobami, jakie mogłem wymyślić:

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

Jeśli nie podoba Ci się postać nieakceptowana wyświetlana przez ułamek sekundy przed usunięciem, poniższa metoda jest moim rozwiązaniem. Zwróć uwagę na liczne dodatkowe warunki, aby uniknąć wyłączenia wszelkiego rodzaju nawigacji i skrótów klawiszowych. Jeśli ktoś wie, jak to uprościć, daj nam znać!

<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) )">
użytkownik235859
źródło
4
typ danych wejściowych = „liczba” nadchodzi w HTML 5 - i możesz użyć JavaScript jako zastępczej polifill ... stevefenton.co.uk/Content/Blog/Date/201105/Blog/
Fenton
5
Dobra metoda, ale można ją złamać, naciskając i przytrzymując niedopuszczalny klawisz
Scott Brown,
8
Zmień wyrażenie regularne na /[^\d+]/i działa z przytrzymaniem
boecko
11
@boecko dziękuje za to, ale pamiętaj, że powinno być /[^\d]+/. Jednak dobre rozwiązanie. Również @ user235859
Mosselman,
11
On też chciał na to pozwolić .. Powinieneś to zrobić/[^0-9.]/g
Qsario
93

Oto prosty, który pozwala na dokładnie jedną dziesiętną, ale nie więcej:

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

billynoah
źródło
12
Uchwyty: kopia + wklej, przeciągnij upuść”, pozwala tylko na 1 dziesiętny, zakładka, usuwanie, Backspace - korzystać z tego jeden
Mathemats
Czy tę logikę wewnątrz wejścia można wyodrębnić, aby można ją było stosować globalnie?
ema
@ema - tak, zobacz moją drugą odpowiedź tutaj, która pokazuje, jak zastosować regułę za pomocą klasy.
billynoah
jeśli użyjesz tego w formie kątowej, wartość nie będzie aktualizowana w wartości kontrolnej formularza.
Ale_info
Niesamowite. Zmieniam zdarzenie na this.value = this.value.replace (/ [^ 0-9 .-] / g, '') .replace (/(\..*)\./ g, '$ 1'). replace (/ ^ 0 + / g, '') .replace (/ (? <! ^) - / g, ''); W ten sposób obsługuje tylko - na początku i nie dopuszcza zer na początku liczby.
brenth 17.07.19
54

I jeszcze jeden przykład, który działa dla mnie świetnie:

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

Dołącz także do zdarzenia naciśnięcia klawisza

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

I HTML:

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

Oto przykład jsFiddle

Vasyl
źródło
Co z wklejonym tekstem?
Jason Ebersey
Dlaczego dostaję komunikat „Zdarzenie jest niezdefiniowane”, gdy wywołuję tę funkcję?
Vincent
1
to nie działa w Firefoksie, gdy zawsze zwracany jest event.keyCode 0. Naprawiłem nowy kod: function validateNumber (event) {var key = event.which || event.charCode || event.keyCode || 0; if (key == 8 || key == 46 || key == 37 || key == 39) {return true; } else if (key <48 || key> 57) {return false; } return true; };
Luan Nguyen
1
Jak powiedziała @Jessica, dodajesz apostrof, a nawet znak procentu.
Alejandro Nava,
1
Bardzo blisko! ale umożliwia użycie więcej niż jednego miejsca po przecinku.
kross
52

HTML5 ma <input type=number>, co brzmi dla Ciebie. Obecnie tylko Opera obsługuje go natywnie, ale istnieje projekt z implementacją JavaScript.

Ms2ger
źródło
Oto dokument określający, które przeglądarki obsługują ten atrybut: caniuse.com/input-number . W chwili pisania tego tekstu zarówno Chrome, jak i Safari w pełni obsługują ten typ pola. IE 10 ma częściowe wsparcie, a Firefox nie ma wsparcia.
Nathan Wallace
Jedynym problemem type=numberjest to, że nie jest obsługiwany przez IE9
J Rod
@JRod Istnieje wieloskładnik dla starej IE. Więcej informacji tutaj .
jkdev
6
Pierwszym problemem jest type=numberzezwolenie na eznak, ponieważ uważa się go za e+10liczbę. Drugi problem polega na tym, że nie można ograniczyć maksymalnej liczby znaków na wejściu.
Hakan Fıstık
Innym problemem jest to, że jeśli typ jest liczbą, to nie mogę uzyskać korzyści z ustawienia typu na, na przykład: „tel”.
ScottyBlades
49

Większość odpowiedzi tutaj ma słabość korzystania z kluczowych zdarzeń .

Wiele odpowiedzi ograniczyłoby twoją zdolność do wybierania tekstu za pomocą makr klawiatury, kopiowania i wklejania i bardziej niechcianych zachowań, inne wydają się zależeć od konkretnych wtyczek jQuery, które zabijają muchy za pomocą karabinów maszynowych.

To proste rozwiązanie wydaje mi się najlepsze dla wielu platform, niezależnie od mechanizmu wprowadzania (naciśnięcie klawisza, kopiowanie + wklejanie, kopiowanie + wklejanie w prawo, wklejanie, zamiana tekstu na mowę itp.). Wszystkie makra klawiatury wyboru tekstu nadal działałyby, a nawet ograniczałyby możliwość ustawiania wartości nieliczbowych za pomocą skryptu.

function forceNumeric(){
    var $input = $(this);
    $input.val($input.val().replace(/[^\d]+/g,''));
}
$('body').on('propertychange input', 'input[type="number"]', forceNumeric);
EJTH
źródło
Wymagana jQuery 1.7+. Jest to bardziej kompletna odpowiedź, ponieważ uwzględnia dane wejściowe za pomocą „kopiowania”. I jest to również prostsze!
Memochipan
Alternatywne wyrażenie regularne: replace(/[^\d]+/g,'')Zamień wszystkie cyfry na pusty ciąg. Modyfikator „i” (bez rozróżniania wielkości liter) nie jest potrzebny.
Memochipan
Powinno to być na górze, ponieważ procedury obsługi zdarzeń „onkey” w tagu nie powinny być już propagowane ...
gpinkas,
To zdecydowanie najlepsza odpowiedź tutaj, ale nie pozwala na cyfry z liczbami dziesiętnymi. Masz pomysł, jak to może działać?
Atirag
6
@Atirag Jeśli chcesz miejsc po przecinku, możesz zmienić regex/[^\d,.]+/
EJTH
41

Zdecydowałem się użyć kombinacji dwóch wymienionych tutaj odpowiedzi, tj

<input type="number" />

i

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

Mahendra
źródło
Doskonała odpowiedź ... +1. Możesz także zredukować instrukcję if do: return !(charCode > 31 && (charCode < 48 || charCode > 57));
schadeck
7
Co powiesz na usunięcie? Chcesz liczb, ale prawdopodobnie chcesz, aby ludzie mogli je poprawić bez odświeżania strony ...
Martin Erlic
39

HTML5 obsługuje wyrażenia regularne, więc możesz użyć tego:

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

Ostrzeżenie: niektóre przeglądarki jeszcze tego nie obsługują.

james.garriss
źródło
7
HTML5 również ma <input type=number>.
Mathias Bynens
Prawdziwe. Powinieneś zrobić z tego odpowiedź. Ups, @ Ms2ger już ma.
james.garriss,
<Input type = number> dodaje strzałki do zwiększania i zmniejszania w niektórych przeglądarkach, więc wydaje się to dobrym rozwiązaniem, gdy chcemy uniknąć tarczy
Ayrad
34
Wzór jest sprawdzany dopiero po przesłaniu. Nadal możesz wprowadzać litery.
Erwin
Co +oznacza atrybut wzorca?
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();
    }
}

dodatkowo możesz dodać przecinek, kropkę i minus (, .-)

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

HTML

<input type="text" onkeydown="validateNumber(event);"/ >
Patrick
źródło
Nie działa poprawnie na klawiaturach, do których należy użyć klawisza Shift, aby wprowadzić cyfrę (np. Europejska klawiatura AZERTY).
Captain Sensible
dzięki stary, naprawdę rozumiesz pytanie! Dobry przykład i obsługa poza kursem. lub, (co większość ludzi chce, jeśli pracują z liczbami)
real_yggdrasil
Jest to jedyny działający, który zapobiega wklejaniu wartości nienumerycznych.
DEREK LEE
16

Tak prosty....

// W funkcji JavaScript (może używać HTML lub PHP).

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

W formularzu wpisz:

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

Z wejściem maks. (Powyższe pozwala na 12-cyfrowy numer)

Rizal Aditya
źródło
Nie rób tego! To blokuje wszystko, klawisze numeryczne, klawisze strzałek, klawisz Delete, skróty (na przykład CTRL + A, CTRL + R), nawet klawisz TAB jest NAPRAWDĘ wkurzający!
Korri
@Korri Nie podążam, co wydaje się być problemem? W moim przypadku działało dobrze.
uneakharsh
pierwsza linia musi zostać zmieniona na:var charCode = (evt.which) ? evt.which : evt.keyCode;
peiman F.,
15

2 rozwiązania:

Użyj walidatora formularza (na przykład z wtyczką sprawdzania poprawności jQuery )

Wykonaj sprawdzenie podczas zdarzenia onblur (tj. Kiedy użytkownik opuści pole) zdarzenia pola wejściowego, używając wyrażenia regularnego:

<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);"/>
romaintaz
źródło
Co ciekawe, musiałem nadać wyrażeniem regularnym „^ \\ d \\.? \\ d * $”, ale może to być spowodowane tym, że strona jest przetwarzana przez transformację XSLT.
Paul Tomblin
Myślę, że wyrażenie regularne jest niepoprawne. Użyłem tej linii:var regExpr = /^\d+(\.\d*)?$/;
costa
@ costa nie jestem pewien, czy użytkownik chce na przykład wpisać .123(zamiast 0.123)?
Romain Linsolas,
@romaintaz. Masz rację, ale wtedy musisz zmienić wyrażenie regularne, aby upewnić się, że w przypadku, gdy przed kropką nie ma cyfr, po kropce znajdują się cyfry. Coś takiego: var regExpr = /^\d+(\.\d*)?$|^\.\d+$/;.
costa
14

Bezpieczniejszym podejściem jest sprawdzanie wartości danych wejściowych zamiast przejmowania naciśnięć klawiszy i próby filtrowania kodów klawiszy.

W ten sposób użytkownik może swobodnie korzystać ze strzałek, klawiszy modyfikujących, cofania, usuwania, używania niestandardowych klawiszy, używania myszy do wklejania, przeciągania i upuszczania tekstu, a nawet wprowadzania danych dotyczących dostępności.

Poniższy skrypt dopuszcza liczby dodatnie i ujemne

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>

EDYCJA: Usunąłem moją starą odpowiedź, ponieważ myślę, że jest już przestarzała.

Vitim.us
źródło
To rzeczywiście wydaje się obejmować większość przypadków
Zia Ul Rehman Mughal
13

Poniżej znajduje się wymienione rozwiązanie. W tym użytkownik może być w stanie wprowadzić tylko numericwartość, użytkownik nie może również być w stanie copy, paste, dragi dropna wejściu.

Dozwolone postacie

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

Niedozwolone Postacie i Postacie poprzez zdarzenia

  • Wartość alfabetyczna
  • Znaki specjalne
  • Kopiuj
  • Pasta
  • Opór
  • Upuszczać

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

Daj mi znać, jeśli to nie zadziała.

Shyam Shingadiya
źródło
11

Jeśli chcesz zasugerować urządzeniu (np. Telefonowi komórkowemu) wartość alfanumeryczną lub cyfrową, możesz użyć <input type="number">.

Steven
źródło
11

Jeszcze jeden przykład, w którym można dodać tylko liczby w polu wprowadzania, nie można liter

<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');">
Mile Mijatović
źródło
10

Krótka i słodka implementacja wykorzystująca jQuery i replace () zamiast patrzeć na event.keyCode lub event.which:

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

Tylko niewielki efekt uboczny polega na tym, że wpisana litera pojawia się na chwilę, a CTRL / CMD + A wydaje się zachowywać nieco dziwnie.

Tarmo
źródło
9

input type="number" jest atrybutem HTML5.

W innym przypadku pomoże ci to:

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)"/>
Vaishali Tekale
źródło
pierwsza linia musi zostać zmieniona na:var charCode = (evt.which) ? evt.which : evt.keyCode;
peiman F.,
9

Kod JavaScript:

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

Kod HTML:

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

działa idealnie, ponieważ kod cofania to 8, a wyrażenie regularne nie pozwala na to, więc jest to łatwy sposób na obejście błędu :)

AirWolf
źródło
9

Łatwym sposobem rozwiązania tego problemu jest zaimplementowanie funkcji jQuery do sprawdzania poprawności znaków regularnych wpisywanych w polu tekstowym na przykład:

Twój kod HTML:

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

I funkcja js za pomocą jQuery

$(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"/>


		

AleKennedy
źródło
8

Tylko inny wariant z użyciem jQuery

$(".numeric").keypress(function() {
    return (/\d/.test(String.fromCharCode(event.which) ))
});
Shurok
źródło
8

wystarczy użyć type = "number", teraz ten atrybut obsługuje większość przeglądarek

<input type="number" maxlength="3" ng-bind="first">
Sai Gopi N.
źródło
Nie sprawdzam danych to --1(2 minus znaki przed 1).
Ngoc Nam
6

Możesz także porównać wartość wejściową (która jest domyślnie traktowana jako ciąg) z samą siłą wymuszoną jako wartość liczbową, na przykład:

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

Musisz jednak powiązać to ze zdarzeniem, takim jak keyup itp.

Cincplug
źródło
6
<input name="amount" type="text" value="Only number in here"/> 

<script>
    $('input[name=amount]').keyup(function(){
        $(this).val($(this).val().replace(/[^\d]/,''));
    });
</script>
Voidcode
źródło
6

Widziałem kilka świetnych odpowiedzi, jednak lubię je tak małe i tak proste, jak to możliwe, więc może ktoś z nich skorzysta. Chciałbym użyć javascript Number()i isNaNfunkcjonalności takich jak to:

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

Mam nadzieję że to pomoże.

Sicha
źródło
1
Uwielbiam to! Takie eleganckie rozwiązanie, bez wyrażenia regularnego.
Levi Roberts
To nie jest odpowiedź na pytanie, OP poprosił o zezwolenie tylko na tekst na wejściu, a nie weryfikację później.
Timberman
Tak, to prawda! Ale jest już zaakceptowana odpowiedź, która moim zdaniem jest dobra, ale pomyślałem, że to może komuś pomóc, a ponadto jest ładna i czysta.
Sicha
5

Użyj tego DOM:

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

I ten skrypt:

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

... LUB ten skrypt, bez indexOf, używając dwóch 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();}
    }
}

Użyłem atrybutu onkeydown zamiast onkeypress, ponieważ atrybut onkeydown jest sprawdzany przed atrybutem onkeypress. Problem dotyczyłby przeglądarki Google Chrome.

Z atrybutem „onkeypress” TAB byłby niekontrolowany za pomocą „preventDefault” w Google Chrome, jednak z atrybutem „onkeydown”, TAB można kontrolować!

Kod ASCII dla TAB => 9

Pierwszy skrypt ma mniej kodu niż drugi, jednak tablica znaków ASCII musi mieć wszystkie klucze.

Drugi skrypt jest znacznie większy niż pierwszy, ale tablica nie potrzebuje wszystkich kluczy. Pierwsza cyfra w każdej pozycji tablicy oznacza liczbę odczytów każdej pozycji. Dla każdego odczytu będzie zwiększany o 1 do następnego. Na przykład:




NCount = 0

48 + NCount = 48

NCount + +

48 + NCount = 49

NCount + +

...

48 + NCount = 57




W przypadku kluczy numerycznych jest tylko 10 (0 - 9), ale gdyby były 1 milion, nie ma sensu tworzyć tablicy z tymi wszystkimi kluczami.

Kody ASCII:

  • 8 ==> (Backspace);
  • 46 => (Usuń);
  • 37 => (strzałka w lewo);
  • 39 => (prawa strzałka);
  • 48 - 57 => (liczby);
  • 36 => (dom);
  • 35 => (koniec);
Daniel
źródło
5

To ulepszona funkcja:

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();
  }
}
Ehsan Chavoshi
źródło
4

Najlepszy sposób (zezwalaj na WSZYSTKIE liczby - prawdziwy ujemny, prawdziwy dodatni, iinteger ujemny, całkowity dodatni) to:

$(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();
    };
}); 
koolo90
źródło
4

To jest rozszerzona wersja rozwiązania geowa4 . Obsługuje mini maxatrybuty. Jeśli liczba jest poza zakresem, zostanie wyświetlona poprzednia wartość.

Możesz to przetestować tutaj.

Stosowanie: <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'));
                }

            }       
    });     
});

Jeśli dane wejściowe są dynamiczne, użyj tego:

$(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'));
            }
    }); 
});
user669677
źródło
@ UżytkownikB nie powinno to niczego usuwać.