Wprowadzanie tekstu HTML umożliwia tylko wprowadzanie liczbowe

Czy istnieje szybki sposób, aby ustawić wejście tekstu HTML (<input type=text />), aby zezwalać tylko na naciśnięcia klawiszy numerycznych (plus'.')?

Author: Julius A, 2009-01-22

30 answers

Uwaga: jest to zaktualizowana odpowiedź. Komentarze poniżej odnoszą się do starej wersji, która namieszała w kodach klawiszy.

JavaScript

Spróbuj sam na JSFiddle.

Możesz filtrować wartości wejściowe tekstu <input> za pomocą następującej funkcji setInputFilter (obsługuje Kopiuj+Wklej, Przeciągnij+Upuść, skróty klawiaturowe, operacje menu kontekstowego, klawisze nietrafione do pisania, pozycję karetki, różne układy klawiatury i wszystkie przeglądarki od 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ć funkcji setInputFilter do zainstalowania filtra wejściowego:

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

Zobacz jsfiddle demo aby uzyskać więcej przykładów filtrów wejściowych. Zauważ również, że nadal musisz wykonać walidację po stronie serwera!

Maszynopis

Oto Wersja maszynopisu tego.

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 tego. Zobacz tę odpowiedź .

HTML 5

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

  • większość przeglądarek sprawdza dane wejściowe tylko podczas przesyłania formularza, a nie podczas wpisywania.
  • Większość mobilnych przeglądarek nie obsługuje step, min i max atrybuty.
  • Chrome (Wersja 71.0.3578.98) nadal pozwala użytkownikowi wprowadzić znaki e i E w polu. Zobacz też to pytanie .
  • Firefox (wersja 64.0) i Edge (EdgeHTML w wersji 17.17134) pozwala użytkownikowi na wpisanie dowolnego tekstu w polu.

Spróbuj sam na w3schools.com .

 1201
Author: emkey08,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-02 06:43:56

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();
  }
}
 298
Author: geowa4,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-26 23:19:48

Długo i ciężko Szukałem dobrej odpowiedzi na to, i desperacko potrzebujemy <input type="number", ale krótko mówiąc, 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ę nieakceptowana postać pokazująca się przez ułamek sekundy przed usunięciem, metoda poniżej jest moim rozwiązaniem. Zwróć uwagę na liczne dodatkowe warunki, ma to na celu uniknięcie wyłączania wszelkiego rodzaju nawigacji i skrótów klawiszowych. Jeśli ktoś wie, jak to zagęś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) )">
 146
Author: user235859,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-04 09:00:36

Tutaj jest prosty, który pozwala na dokładnie jeden dziesiętny, ale nie więcej:

<input type="text" oninput="this.value = this.value.replace(/[^0-9.]/g, '').replace(/(\..*?)\..*/g, '$1');" />
 124
Author: billynoah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-12-18 13:27:06

Większość odpowiedzi tutaj wszystkie mają słabość do używania key-events .

Wiele odpowiedzi ograniczyłoby możliwość wyboru tekstu za pomocą makr klawiatury, kopiowania+wklejania i innych niechcianych zachowań, inne zdają się zależeć od konkretnych wtyczek jQuery, które zabijają muchy karabinami maszynowymi.

To proste rozwiązanie wydaje się działać najlepiej dla mnie cross platform, niezależnie od mechanizmu wprowadzania (naciśnięcie klawisza, kopiuj+wklej, rightclick kopiuj+wklej, mowa-tekst itp.). Wszystkie teksty makra klawiatury wyboru nadal działały, a nawet ograniczały możliwość ustawiania przez skrypt wartości nieliczbowej.

function forceNumeric(){
    var $input = $(this);
    $input.val($input.val().replace(/[^\d]+/g,''));
}
$('body').on('propertychange input', 'input[type="number"]', forceNumeric);
 56
Author: EJTH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-09-17 05:04:06

HTML5 mA <input type=number>, co brzmi dobrze dla Ciebie. Obecnie tylko Opera obsługuje go natywnie, ale istnieje Projekt , który ma implementację JavaScript.

 54
Author: Ms2ger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-22 18:09:35

I jeszcze jeden przykład, który świetnie mi się sprawdza:

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 również do zdarzenia keypress

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

I HTML:

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

Oto przykład jsFiddle

 54
Author: Vasyl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-13 19:24:05

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ą.

 43
Author: james.garriss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-02 12:52:52

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

 41
Author: Mahendra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-18 18:48:49

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

Dodatkowe można 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);"/ >
 19
Author: patrick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-27 13:31:24

2 rozwiązania:

Użyj walidatora formularza (na przykład z jQuery validation plugin)

Wykonaj sprawdzenie podczas zdarzenia onblur (tzn. gdy użytkownik opuści pole) pola wejściowego za pomocą 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);"/>
 17
Author: romaintaz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-02 15:15:32

To takie proste....

// 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 max. (Powyższe pozwala na 12-cyfrowy numer)

 16
Author: Rizal Aditya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-13 18:56:10

Bezpieczniejszym podejściem jest sprawdzanie wartości wejścia, zamiast przejmowania naciśnięć klawiszy i prób filtrowania kodów klawiszy.

W ten sposób użytkownik może swobodnie używać strzałek na klawiaturze, klawiszy modyfikujących, backspace, kasować, używać niestandardowych klawiatur, używać myszy do wklejania, przeciągać i upuszczać tekst, nawet używać wejść ułatwień dostępu.

Poniższy skrypt umożliwia użycie liczb dodatnich i ujemnych

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>

EDIT: usunąłem moją starą odpowiedź, bo myślę, że jest przestarzałe.

 14
Author: Vitim.us,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-14 01:29:49

Możesz użyć do tego wzoru:

<input id="numbers" pattern="[0-9.]+" type="number">

Tutaj możesz zobaczyć pełne wskazówki dotyczące interfejsu strony mobilnej .

 13
Author: Ashisha Nautiyal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-13 18:58:02

Proszę znaleźć poniżej wymienione rozwiązanie. W tym uĺźytkowniku moĹźna wpisaÄ ‡ tylko wartoĹ " Ä ‡ numeric, takĹźe uĺźytkownik nie moĹźecopy, paste, drag i drop input.

Dozwolone Znaki

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

Niedozwolone postacie i postacie poprzez zdarzenia

  • wartość alfabetyczna
  • specjalne znaki
  • Kopia
  • Wklej
  • Drag
  • Drop

$(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.
 13
Author: Shyam Shingadiya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-03 08:58:53

Jeszcze jeden przykład, gdzie Można Dodać tylko cyfry w polu wejściowym, nie można litery

<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');">
 13
Author: Mile Mijatović,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-04 16:46:54

Jeśli chcesz zasugerować urządzenie (może telefon komórkowy) pomiędzy alfą lub cyfrą, możesz użyć <input type="number">.

 11
Author: Steven,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-13 19:24:21

Krótka i słodka implementacja używająca jQuery i replace () zamiast patrzenia na zdarzenie.keyCode lub event.które:

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

Tylko mały efekt uboczny, że wpisana litera pojawia się chwilowo i CTRL / CMD + a wydaje się zachowywać trochę dziwnie.

 10
Author: Tarmo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-23 10:41:54

Łatwym sposobem rozwiązania tego problemu jest zaimplementowanie funkcji jQuery do walidacji za pomocą regex znaków wpisanych 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"/>


		
 10
Author: AleKennedy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-01-09 15:05:14

input type="number" jest atrybutem HTML5.

W drugim przypadku to ci pomoże:

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)"/>
 9
Author: Vaishali Tekale,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-13 18:57:32

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 klawisza backspace to 8, a wyrażenie regex na to nie pozwala, więc jest to łatwy sposób na ominięcie błędu:)

 9
Author: AirWolf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-13 19:28:32

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

<input type="number" maxlength="3" ng-bind="first">
 9
Author: Sai Gopi Me,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-23 05:54:35

Tylko inny wariant z jQuery używając

$(".numeric").keypress(function() {
    return (/\d/.test(String.fromCharCode(event.which) ))
});
 8
Author: Shurok,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-23 17:52:56

Widziałem kilka świetnych odpowiedzi, ale lubię je tak małe i tak proste, jak to tylko możliwe, więc może ktoś z nich skorzysta. Użyłbym javascript Number() i isNaN funkcjonalności w ten sposób:

if(isNaN(Number(str))) {
   // ... Exception it is NOT a number
} else {
   // ... Do something you have a number
}
Mam nadzieję, że to pomoże.
 7
Author: Sicha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-04-11 12:17:21

Można również porównać wartość wejściową (która domyślnie jest traktowana jako ciąg znaków) do siebie wymuszonej jako liczba, np.:

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

Musisz jednak powiązać to z wydarzeniem takim jak keyup itp.

 6
Author: cincplug,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-22 10:38:59
<input name="amount" type="text" value="Only number in here"/> 

<script>
    $('input[name=amount]').keyup(function(){
        $(this).val($(this).val().replace(/[^\d]/,''));
    });
</script>
 6
Author: Voidcode,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-06 20:46:06

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, za pomocą dwóch for ' s...

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 byłby w przeglądarce Google Chrome.

Z atrybutem "onkeypress" TAB byłaby niekontrolowana z "preventDefault" w google chrome, jednak z atrybutem "onkeydown" TAB staje się / align = "left" /

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 od pierwszego, ale tablica nie potrzebuje wszystkich kluczy. Pierwsza cyfra w każdej pozycji tablicy to ilość razy, ile każda pozycja zostanie odczytana. Dla każdego odczytu, zostanie zwiększona 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 ich tylko 10( 0-9), ale gdyby ich było 1 milion, nie miałoby sensu tworzenie tablicy z tymi wszystkimi kluczami.

Kody ASCII:

  • 8 ==> (Backspace);
  • 46 = > (Delete);
  • 37 = > (strzałka w lewo);
  • 39 = > (strzałka w prawo);
  • 48 - 57 => (liczby);
  • 36 = > (home);
  • 35 = > (end);
 5
Author: Daniel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-13 19:15:02

Jest 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();
  }
}
 5
Author: Ehsan Chavoshi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-13 19:24:42

Najlepszym sposobem (niech wszystkie typy liczb-prawdziwe ujemne, prawdziwe dodatnie, iinteger ujemne, integer dodatnie) jest:

$(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
Author: koolo90,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-01 07:07:20

Jest to rozszerzona wersja rozwiązania geowa4 . Obsługuje atrybuty min i max. Jeśli liczba jest poza zakresem, zostanie wyświetlona poprzednia wartość.

Możesz go przetestować tutaj.

Użycie: <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'));
            }
    }); 
});
 4
Author: 6 revsuser669677,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:57