HTML 텍스트 입력은 숫자 입력 만 허용


852

<input type=text />숫자 키 입력 ( '.') 만 허용하도록 HTML 텍스트 입력 ( ) 을 설정하는 빠른 방법이 있습니까?


81
여기서 많은 솔루션은 키를 누를 때만 작동합니다. 사람들이 메뉴를 사용하여 텍스트를 붙여 넣거나 텍스트를 텍스트 입력으로 끌어다 놓으면 실패합니다. 나는 전에 그것에 물린 적이있다. 조심해!
Bennett McElwee

83
@JuliusA - 당신은 항상 항상 어쨌든 서버 측 유효성 검사가 필요합니다.
Stephen P

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

14
@Droogans는 TAB과 같은 다른 키를 비활성화하여 다음 입력으로 이동하거나 입력에 초점을 맞춘 경우 웹 사이트를 새로 고치기 위해 cmd + R과 같은 입력과 직접 관련되지 않은 다른 바로 가기로 이동합니다.
Alejandro Pérez

1
플러그인이 괜찮다면 NumericInput을 사용하십시오. 데모 : jsfiddle.net/152sumxu/2 자세한 내용은 여기를 클릭하십시오 stackoverflow.com/a/27561763/82961
Faiz

답변:


1137

참고 : 이것은 업데이트 된 답변입니다. 아래 주석은 키 코드로 엉망이 된 이전 버전을 나타냅니다.

자바 스크립트

JSFiddle에서 직접 사용해보십시오 .

<input>다음 setInputFilter기능 을 사용하여 텍스트의 입력 값을 필터링 할 수 있습니다 (Copy + Paste, Drag + Drop, 키보드 단축키, 상황에 맞는 메뉴 작업, 입력 할 수없는 키, 캐럿 위치, 다른 키보드 레이아웃 및 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 = "";
      }
    });
  });
}

이제이 setInputFilter기능을 사용하여 입력 필터를 설치할 수 있습니다 .

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

더 많은 입력 필터 예제 는 JSFiddle 데모 를 참조하십시오 . 또한 서버 측 유효성 검사를 수행해야합니다.

TypeScript

여기에 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

이것의 jQuery 버전도 있습니다. 이 답변을 참조하십시오 .

HTML 5

HTML 5에는 다음과 같은 기본 솔루션이 있지만 ( 사양<input type="number"> 참조 ) 브라우저 지원은 다양합니다.

  • 대부분의 브라우저는 입력 할 때가 아니라 양식을 제출할 때만 입력의 유효성을 검사합니다.
  • 대부분의 모바일 브라우저는 지원하지 않습니다 step, minmax특성을.
  • 크롬 (버전 71.0.3578.98)는 여전히 사용자가 문자를 입력 할 수 있습니다 eE필드에. 이 질문 도 참조하십시오 .
  • Firefox (버전 64.0) 및 Edge (EdgeHTML 버전 17.17134) 를 사용하면 필드에 텍스트 를 입력 할 수 있습니다.

w3schools.com에서 직접 사용해보십시오 .


4
이것이 좋은 선택이지만, 여전히 /, 여러 개의 점, 다른 연산자와 같은 문자를 입력 할 수 있습니다.
Mahendra Liya

6
여전히 Firefox 21에서 지원되지 않습니다 (IE9 또는 이전 버전에 대해서는 이야기조차하지 않습니다 ...)
JBE

67
입력 유형 번호는 입력이 숫자 만 받아들이도록하기위한 것이 아닙니다. '항목 수'를 지정하는 입력을위한 것입니다. 예를 들어 Chrome은 작은 화살표 두 개를 추가하여 숫자를 하나씩 줄입니다. 적절한 숫자 만 입력하는 것은 HTML에 대한 어리석은 누락입니다.
Erwin

9
type = "number"는 실제로 필드에 유효하지 않은 텍스트를 입력하는 것을 막지 않습니다. 크롬에서도 가비지 데이터를 잘라내어 필드에 붙여 넣을 수도 있습니다.
완벽 주의자

6
내가 추가 할 수있는 유일한 것은 MacOSX 사용자를 포함하도록 Ctrl + A 줄을 변경하는 것입니다.(e.keyCode == 65 && (e.ctrlKey === true || e.metaKey === true))
MForMarlon

280

이 DOM을 사용하십시오

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

그리고이 스크립트

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의 독일어 설정. 좋은 유용성을위한 일부 키가 작동하지 않음 :-백 스페이스 (keyCode : 8)-탐색 키 왼쪽 및 오른쪽 (keyCode : 37, 38) 복사 및 붙여
넣기도

11
대부분의 사람들은 스크립트 오류가 사이트에 제대로 반영되지 않도록주의를 기울입니다.
Robert Jeppesen

14
이 코드에는 거의 문제가 없습니다. 을 입력 할 수 있습니다. 두 번 이상, 둘째로 삭제 키를 허용하지 않습니다.
coure2011

4
백 스페이스, 삭제 및 화살표가 작동하지 않는 것에 대해 걱정했습니다. "theEvent.keycode ||"를 제거하고 "if (/ [-~] / &&! regex.test (key)) {"를 추가하면 더 잘 작동합니다 (ASCII / UTF의 경우). 그러나 한자를 거부하지 않습니다! :)
Sam Watkins 2018 년

4
이 사람이 입력에 임의의 물건을 붙여 넣을 수 있습니다
Vitim.us

136

나는 이것에 대한 좋은 대답을 찾기 위해 오랫동안 열심히 노력했고, 우리는 필사적으로 필요 <input type="number"하지만,이 두 가지가 내가 얻을 수있는 가장 간결한 방법입니다.

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

허용되지 않는 문자가 1 초 동안 표시되지 않고 삭제되기 전에 싫어하는 경우 아래 방법이 내 해결책입니다. 수많은 추가 조건에 유의하십시오. 이는 모든 종류의 탐색 및 핫키를 비활성화하지 않기위한 것입니다. 누구든지 이것을 압축하는 방법을 알고 있다면 알려주십시오!

<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로 제공됩니다. JavaScript를 대체 폴리 필로 사용할 수 있습니다 ... stevefenton.co.uk/Content/Blog/Date/201105/Blog/…
Fenton

5
좋은 방법이지만 허용 할 수없는 키를 길게 누르면 파손될 수 있습니다
Scott Brown

8
에 정규식을 변경 /[^\d+]/하며 누른 작동
boecko

11
@boecko 이것에 대해 감사하지만 /[^\d]+/대신 해야합니다 . 그래도 좋은 해결책입니다. @ user235859
Mosselman

11
그는 .또한 허용하고 싶었다 . 실제로 /[^0-9.]/g
해봐야

93

다음은 정확히 하나의 십진수를 허용하지만 더 이상은 허용하지 않는 간단한 것입니다.

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


12
처리 : 복사 + 붙여 넣기, 드래그 앤 드롭, 소수점 이하 1 자만 허용, 탭, 삭제, 백 스페이스-이것을 사용하십시오
Mathemats

oninput 내부의 논리를 추출하여 전 세계적으로 사용할 수 있습니까?
ema

@ema - 그래, 내 다른 대답을 참조 여기에 당신이 클래스를 사용하여 규칙을 적용 할 수있는 방법 어떤을 보여줍니다.
billynoah

각도 형식에서이 값을 사용하면 값이 양식 제어 값에서 업데이트되지 않습니다.
Ale_info

대박. 이벤트를 this.value = this.value.replace (/ [^ 0-9 .-] / g, '') .replace (/(\..*)\./ g, '$ 1')로 변경합니다. 바꾸기 (/ ^ 0 + / g, '') .replace (/ (? <! ^)-/ g, ''); 이렇게하면 처음에는-만 처리하고 숫자의 시작에는 0을 허용하지 않습니다.
brenth

54

그리고 또 하나의 예가 나에게 효과적입니다.

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

키 누르기 이벤트에도 연결

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

그리고 HTML :

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

다음은 jsFiddle 예제입니다


붙여 넣은 텍스트는 어떻습니까?
Jason Ebersey 2016

이 함수를 호출 할 때 "이벤트가 정의되지 않았습니다"라는 이유는 무엇입니까?
Vincent

1
event.keyCode가 항상 0으로 반환되면 Firefox에서는 작동하지 않습니다. 새 코드로 수정했습니다. 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 (키 <48 || 키> 57) {return false; } true를 반환; };
Luan Nguyen

1
@Jessica가 말했듯이 아포스트로피와 백분율 기호를 추가합니다.
Alejandro Nava

1
아주 근접한! 그러나 둘 이상의 소수를 허용합니다.
KROSS

52

HTML5에는 <input type=number>이 소리가납니다. 현재 Opera 만 기본적으로 지원하지만 JavaScript로 구현 된 프로젝트 가 있습니다.


여기에 브라우저가이 속성을 지원하는 문서 정의는 다음과 같습니다 caniuse.com/input-number . 이 글을 쓰는 시점에서 Chrome과 Safari는이 유형 필드를 완전히 지원합니다. IE 10은 부분적으로 지원되며 Firefox는 지원하지 않습니다.
Nathan Wallace

유일한 문제 type=number는 IE9에서 지원하지 않는 것입니다.
J Rod

@JRod있다 polyfill 오래된 IE 용. 자세한 내용은 여기를 참조하십시오 .
jkdev

6
첫 번째 문제는 숫자로 간주되기 때문에 문자를 type=number허용하는 ee+10입니다. 두 번째 문제는 입력에서 최대 문자 수를 제한 할 수 없다는 것입니다.
Hakan Fıstık

또 다른 문제는 유형이 숫자이면 유형을 "tel"로 설정하면 이점을 얻을 수 없다는 것입니다.
ScottyBlades

49

여기에있는 대부분의 대답은 모두 키 이벤트 사용의 약점을 가지고 있습니다 .

많은 답변은 키보드 매크로, 복사 + 붙여 넣기 및 더 원치 않는 동작으로 텍스트 선택을 수행하는 기능을 제한하고 다른 일부는 특정 jQuery 플러그인에 의존하는 것처럼 보입니다.

이 간단한 솔루션은 입력 메커니즘 (키 입력, 복사 + 붙여 넣기, 마우스 오른쪽 클릭 복사 + 붙여 넣기, 음성-텍스트 등)에 관계없이 크로스 플랫폼에 가장 적합합니다. 모든 텍스트 선택 키보드 매크로는 여전히 작동하며 스크립트를 통해 숫자가 아닌 값을 설정하는 기능도 제한합니다.

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

jQuery 1.7 이상이 필요합니다. 이것은 "복사"를 통한 입력을 고려하기 때문에보다 완전한 대답입니다. 그리고 더 간단합니다!
Memochipan 2016 년

대체 정규식 : replace(/[^\d]+/g,'')숫자가 아닌 모든 문자를 빈 문자열로 바꿉니다. "i"(대소 문자 구분) 수정자는 필요하지 않습니다.
Memochipan

태그의 "onkey"이벤트 핸들러는 더 이상 전파되지 않아야하므로 맨 위에 있어야합니다.
gpinkas

이것은 확실히 가장 좋은 대답이지만 10 진수가있는 숫자는 허용하지 않습니다. 그게 어떻게 작동하는지 아십니까?
Atirag

6
당신이 소수를 원하는 경우 @Atirag 당신은 정규식 변경할 수 있습니다/[^\d,.]+/
EJTH

41

나는 여기에 언급 된 두 가지 대답의 조합을 사용하기로 결정했습니다.

<input type="number" />

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


훌륭한 답변 ... +1. if 문을 다음과 같이 줄일 수도 있습니다. return !(charCode > 31 && (charCode < 48 || charCode > 57));
schadeck

7
그래도 삭제는 어떻습니까? 당신은 숫자를 원하지만 아마도 사람들이 페이지를 새로 고치지 않고 그것들을 바로 잡을 수 있기를 원할 것입니다 ...
Martin Erlic

39

HTML5는 정규식을 지원하므로 다음을 사용할 수 있습니다.

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

경고 : 일부 브라우저는 아직이 기능을 지원하지 않습니다.


7
HTML5도 있습니다 <input type=number>.
Mathias Bynens

진실. 이 답변을해야합니다. @ Ms2ger는 이미 가지고 있습니다.
james.garriss

<input type = number>는 특정 브라우저에서 증가 및 감소를위한 화살표를 추가하므로 스피너를 피하고 싶을 때 좋은 해결책처럼 보입니다
Ayrad

34
제출시 패턴 만 확인됩니다. 여전히 글자를 입력 할 수 있습니다.
Erwin

+패턴 속성 의 의미는 무엇입니까 ?
PlanetHackers

18

자바 스크립트

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

또한 쉼표, 마침표 및 빼기 (, .-)를 추가 할 수 있습니다.

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

HTML

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

Shift 키를 사용하여 숫자를 입력해야하는 키보드 (예 : 유럽 AZERTY 키보드)에서는 올바르게 작동하지 않습니다.
Captain Sensible

고마워요, 당신은 정말로 질문을 이해합니다! 좋은 예 및 오프 코스 처리. 또는 (대부분의 사람들이 숫자로 작업하는 경우
원함

숫자가 아닌 값을 붙여 넣지 못하게하는 유일한 방법입니다.
데릭 리

16

너무 간단합니다 ....

// JavaScript 함수에서 (HTML 또는 PHP를 사용할 수 있음).

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

양식 입력에서 :

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

최대 입력 (이것들은 12 자리 숫자를 허용합니다)


하지마! 이것은 숫자 키패드, 화살표 키, Delete 키, 단축키 (예를 들어 CTRL + A, CTRL + R), TAB 키조차도 정말 귀찮습니다!
Korri

@ Korri 내가 따르지 않는, 문제는 무엇입니까? 내 경우에는 잘 작동했습니다.
uneakharsh

첫 줄은 다음과 같이 변경되어야합니다 :var charCode = (evt.which) ? evt.which : evt.keyCode;
peiman F.

15

2 가지 해결책 :

양식 유효성 검사기 사용 (예 : jQuery 유효성 검사 플러그인 사용 )

입력 필드의 onblur (즉, 사용자가 필드를 떠날 때) 이벤트 중에 정규 표현식을 사용하여 점검하십시오.

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

흥미롭게도 정규식에 "^ \\ d \\.? \\ d * $"를 제공해야했지만 페이지가 XSLT 변환을 통해 실행 되었기 때문일 수 있습니다.
Paul Tomblin

정규식이 잘못되었다고 생각합니다. 나는이 줄을 사용했다 :var regExpr = /^\d+(\.\d*)?$/;
costa

예를 들어 사용자가 .123(대신에 0.123) 대신 입력을 원한다면 @costa 확실하지 않습니까?
Romain Linsolas

@romaintaz. 맞습니다. 그러나 점 앞에 숫자가없는 경우 점 뒤에 숫자가 있는지 확인하기 위해 정규식을 변경해야합니다. 이와 같은 것 : var regExpr = /^\d+(\.\d*)?$|^\.\d+$/;.
코스타

14

보다 안전한 방법은 키 누르기를 하이재킹하고 키 코드를 필터링하는 대신 입력 값을 확인하는 것입니다.

이 방법으로 사용자는 키보드 화살표, 수정 자 키, 백 스페이스, 삭제, 비표준 키보드 사용, 마우스를 사용하여 붙여 넣기, 텍스트 드래그 앤 드롭 사용, 접근성 입력을 자유롭게 사용할 수 있습니다.

아래 스크립트는 양수와 음수를 허용합니다

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>

편집 : 나는 그것이 구식이라고 생각하기 때문에 이전 답변을 제거했습니다.


이것은 실제로 대부분의 경우 다루 보인다
지아 UL 레흐만 무굴


13

아래에 언급 된 해결책을 찾으십시오. 이 사용자 만 입력 할 수있다에서 numeric값을, 또한 사용자가 할 수없는 copy, paste, dragdrop입력한다.

허용되는 문자

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

이벤트를 통한 문자 및 문자는 허용되지 않습니다

  • 알파벳 값
  • 특수 문자
  • 견인
  • 하락

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

작동하지 않는 경우 알려주십시오.


11

알파 또는 숫자 사이의 장치 (휴대 전화 일 수도 있음)를 제안하려면을 사용할 수 있습니다 <input type="number">.


11

입력 필드에 숫자 만 추가 할 수 있고 문자 는 입력 할 수없는 또 하나의 예

<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 또는 event. 대신 jQuery와 replace ()를 사용하는 짧고 달콤한 구현입니다.

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

입력 한 문자가 잠시 나타나고 CTRL / CMD + A의 작은 부작용 만 약간 이상하게 보입니다.


9

input type="number" HTML5 속성입니다.

다른 경우에는 이것이 도움이 될 것입니다.

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

첫 줄은 다음과 같이 변경되어야합니다 :var charCode = (evt.which) ? evt.which : evt.keyCode;
peiman F.

9

자바 스크립트 코드 :

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 코드 :

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

백 스페이스 키 코드가 8이고 정규 표현식이 허용하지 않기 때문에 완벽하게 작동하므로 버그를 우회하는 쉬운 방법입니다. :)


9

이 문제를 해결하는 쉬운 방법은 텍스트 상자에 입력 한 문자를 정규식으로 검증하는 jQuery 함수를 구현하는 것입니다.

귀하의 HTML 코드 :

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

jQuery를 사용하는 js 함수

$(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를 사용하는 다른 변형

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

8

type = "number" 만 사용 하면이 속성이 대부분의 브라우저에서 지원됩니다.

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

데이터가 --1(1 앞에 2 빼기 문자) 인지 확인하지 않았습니다 .
Ngoc Nam

6

다음과 같이 입력 값 (기본적으로 문자열로 처리됨)을 숫자로 강제로 비교할 수도 있습니다.

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

그러나 키업 등과 같은 이벤트에 바인딩해야합니다.


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

나는 훌륭한 답변을 보았지만 가능한 작고 간단한 것을 좋아하므로 누군가가 혜택을 볼 수 있습니다. 다음 Number()isNaN같이 자바 스크립트 와 기능을 사용 합니다.

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

도움이 되었기를 바랍니다.


1
나는 이것을 좋아한다! 그런 우아한 솔루션으로 정규 표현식이 필요하지 않습니다.
Levi Roberts

이것은 질문에 대한 답변이 아니며 OP는 입력에서만 텍스트를 허용하고 나중에 확인할 수는 없었습니다.
Timberman

그렇습니다, 그것은 진실입니다! 그러나 이미 좋은 것으로 생각되는 대답이 있지만 이것이 누군가에게 도움이 될 수 있다고 생각했습니다.
Sicha

5

이 DOM을 사용하십시오 :

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

그리고이 스크립트 :

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

... 또는 두 개의 사용하여 같이 IndexOf없이이 스크립트, 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();}
    }
}

onkeydown 속성이 onkeypress 속성보다 먼저 확인되므로 onkeypress 대신 onkeydown 속성을 사용했습니다. Chrome 브라우저에 문제가 있습니다.

"onkeypress"속성을 사용하면 Google 크롬에서 "preventDefault"를 사용하여 TAB를 제어 할 수 없지만 "onkeydown"속성을 사용하면 TAB을 제어 할 수 있습니다!

TAB의 ASCII 코드 => 9

첫 번째 스크립트는 두 번째 스크립트보다 코드가 적지 만 ASCII 문자 배열에는 모든 키가 있어야합니다.

두 번째 스크립트는 첫 번째 스크립트보다 훨씬 크지 만 배열에 모든 키가 필요한 것은 아닙니다. 배열의 각 위치에서 첫 번째 숫자는 각 위치를 읽는 횟수입니다. 각 판독 값에 대해 다음 판독 값으로 1 씩 증가합니다. 예를 들면 다음과 같습니다.




NCount = 0

48 + N 카운트 = 48

N 카운트 + +

48 + N 카운트 = 49

N 카운트 + +

...

48 + NCount = 57




숫자 키가 10 (0-9) 인 경우, 백만 키인 경우 이러한 키를 모두 사용하여 배열을 만드는 것은 의미가 없습니다.

ASCII 코드 :

  • 8 ==> (백 스페이스);
  • 46 => (삭제);
  • 37 => (왼쪽 화살표);
  • 39 => (오른쪽 화살표);
  • 48-57 => (숫자);
  • 36 => (집);
  • 35 => (끝);

5

이것은 개선 된 기능입니다.

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

가장 좋은 방법은 (모든 유형의 숫자-실수 음수, 실수 양수, 정수 음수, 정수 양수)입니다.

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

이것은 geowa4 솔루션 의 확장 버전입니다 . 지원 minmax속성. 숫자가 범위를 벗어나면 이전 값이 표시됩니다.

여기서 테스트 할 수 있습니다.

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

            }       
    });     
});

입력이 동적이면 다음을 사용하십시오.

$(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 이것은 아무것도 삭제하지 않아야합니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.