텍스트 상자의 "숫자"전용 입력을 제한하는 가장 좋은 방법은 무엇입니까?
소수점을 허용하는 것을 찾고 있습니다.
많은 예를 봅니다. 그러나 어느 것을 사용할 것인지 아직 결정하지 않았습니다.
Praveen Jeganathan에서 업데이트
더 이상 플러그인이 아니라 jQuery는 jQuery.isNumeric()v1.7에서 자체적으로 추가했습니다. 참조 : https://stackoverflow.com/a/20186188/66767
텍스트 상자의 "숫자"전용 입력을 제한하는 가장 좋은 방법은 무엇입니까?
소수점을 허용하는 것을 찾고 있습니다.
많은 예를 봅니다. 그러나 어느 것을 사용할 것인지 아직 결정하지 않았습니다.
Praveen Jeganathan에서 업데이트
더 이상 플러그인이 아니라 jQuery는 jQuery.isNumeric()v1.7에서 자체적으로 추가했습니다. 참조 : https://stackoverflow.com/a/20186188/66767
답변:
이에 대한 새롭고 매우 간단한 해결책이 있습니다.
다양한 숫자 필터를 포함 하여 텍스트에 모든 종류의 입력 필터 를 사용할 수 있습니다
<input>. 이것은 복사 + 붙여 넣기, 드래그 + 드롭, 키보드 단축키, 상황에 맞는 메뉴 작업, 입력 할 수없는 키 및 모든 키보드 레이아웃을 올바르게 처리합니다.
참조 이 대답을 하거나 스스로를 시도 JSFiddle에 .
jquery.numeric 플러그인 으로 많은 양식을 성공적으로 구현했습니다 .
$(document).ready(function(){
$(".numeric").numeric();
});
또한 이것은 텍스트 영역에서도 작동합니다!
그러나 Ctrl + A, 상황에 맞는 메뉴를 통한 복사 + 붙여 넣기 및 드래그 + 드롭은 예상대로 작동 하지 않습니다 .
HTML 5 표준에 대한 광범위한 지원으로 요소의 pattern속성과 number유형을 사용 input하여 숫자 만 입력을 제한 할 수 있습니다. 일부 브라우저 (특히 Chrome)에서는 숫자가 아닌 내용의 붙여 넣기도 제한합니다. 더 자세한 정보 number및 기타 최신 입력 유형은 여기를 참조하십시오 .
allowDecimal하여 정수 값만 허용하려고 할 때마다 옵션이 있습니다. 소스는 매우 간단하고 잘 작성되었습니다.
type="number".
유효성 검사가 아닌 입력을 제한하려는 경우 주요 이벤트로 작업 할 수 있습니다. 이 같은:
<input type="text" class="numbersOnly" value="" />
과:
jQuery('.numbersOnly').keyup(function () {
this.value = this.value.replace(/[^0-9\.]/g,'');
});
이를 통해 사용자는 유효성 검사 단계에서 나중에 알파벳 문자 등을 입력 할 수 없음을 즉시 알 수 있습니다.
마우스로 잘라서 붙여 넣거나 키 이벤트를 트리거하지 않는 양식 자동 완성 기능을 사용하여 입력 내용을 채울 수 있기 때문에 여전히 유효성 검사를 원할 것입니다.
$doc.on('keyup blur input propertychange', 'input[name="price"]', function(){$(this).val($(this).val().replace(/[^0-9\.]/g,''));});
가장 좋은 대답은 위의 방법이라고 생각했습니다.
jQuery('.numbersOnly').keyup(function () {
this.value = this.value.replace(/[^0-9\.]/g,'');
});
그러나 화살표 키와 삭제 버튼이 커서를 문자열의 끝 부분에 맞추는 것이 약간 고통 스럽다는 것에 동의합니다 (테스트 때문에 나에게 쫓겨났습니다)
나는 간단한 변화를 추가했다
$('.numbersOnly').keyup(function () {
if (this.value != this.value.replace(/[^0-9\.]/g, '')) {
this.value = this.value.replace(/[^0-9\.]/g, '');
}
});
이렇게하면 텍스트가 변경되지 않는 버튼 히트가있는 경우 무시하십시오. 이것으로 당신은 끝까지 점프하지 않고 화살표를 누르고 삭제할 수 있지만 숫자가 아닌 텍스트는 지 웁니다.
keypress분명히 있기 때문에 더욱,이를 단순화하는 데 사용할 수 있습니다 keyup및 keydown트리거 모든 키보드 키 반면, keypress 만 (따라서 "문자"키에 대한 트리거 하지 화살표 및 삭제 키 트리거). 이 답변 참조 : stackoverflow.com/a/1367720/1298685
jquery.numeric 플러그인에는 저자에게 알려주는 몇 가지 버그가 있습니다. Safari와 Opera에서 소수점을 여러 개 사용할 수 있으며 Opera에서 백 스페이스, 화살표 키 또는 기타 여러 제어 문자를 입력 할 수 없습니다. 양의 정수 입력이 필요했기 때문에 결국 내 자신을 작성했습니다.
$(".numeric").keypress(function(event) {
// Backspace, tab, enter, end, home, left, right
// We don't support the del key in Opera because del == . == 46.
var controlKeys = [8, 9, 13, 35, 36, 37, 39];
// IE doesn't support indexOf
var isControlKey = controlKeys.join(",").match(new RegExp(event.which));
// Some browsers just don't raise events for control keys. Easy.
// e.g. Safari backspace.
if (!event.which || // Control keys in most browsers. e.g. Firefox tab is 0
(49 <= event.which && event.which <= 57) || // Always 1 through 9
(48 == event.which && $(this).attr("value")) || // No 0 first digit
isControlKey) { // Opera assigns values for control keys.
return;
} else {
event.preventDefault();
}
});
더 이상 플러그인 이 아닌 jQuery 는 v1.7에 추가 된 자체 jQuery.isNumeric ()을 구현했습니다 .
jQuery.isNumeric( value )인수가 숫자인지 확인합니다.
$.isNumeric( "-10" ); // true
$.isNumeric( 16 ); // true
$.isNumeric( 0xFF ); // true
$.isNumeric( "0xFF" ); // true
$.isNumeric( "8e5" ); // true (exponential notation string)
$.isNumeric( 3.1415 ); // true
$.isNumeric( +10 ); // true
$.isNumeric( 0144 ); // true (octal integer literal)
$.isNumeric( "" ); // false
$.isNumeric({}); // false (empty object)
$.isNumeric( NaN ); // false
$.isNumeric( null ); // false
$.isNumeric( true ); // false
$.isNumeric( Infinity ); // false
$.isNumeric( undefined ); // false
다음은 isNumeric ()을 이벤트 리스너와 묶는 방법의 예입니다.
$(document).on('keyup', '.numeric-only', function(event) {
var v = this.value;
if($.isNumeric(v) === false) {
//chop off the last char entered
this.value = this.value.slice(0,-1);
}
});
var v = this.value;변경하십시오 var v = this.value.replace(/,/g,'');. 과 같은 숫자 21,345,67.800도 고려됩니다.
$(document).on('keyup keypress', '#somethingSomething', function(){ var aValue = $(this).val(); if($.isNumeric(aValue) === false){ $(this).val(aValue.slice(0,-1)); } });
위에서 언급 한 numeric () 플러그인은 Opera에서 작동하지 않습니다 (백 스페이스 키, 백 스페이스 키 또는 포워드 키를 사용할 수 없음).
JQuery 또는 Javascript에서 아래 코드는 완벽하게 작동합니다 (두 줄에 불과합니다).
jQuery :
$(document).ready(function() {
$('.key-numeric').keypress(function(e) {
var verified = (e.which == 8 || e.which == undefined || e.which == 0) ? null : String.fromCharCode(e.which).match(/[^0-9]/);
if (verified) {e.preventDefault();}
});
});
자바 스크립트 :
function isNumeric(e)
{
var keynum = (!window.event) ? e.which : e.keyCode;
return !((keynum == 8 || keynum == undefined || e.which == 0) ? null : String.fromCharCode(keynum).match(/[^0-9]/));
}
물론 이것은 순수한 숫자 입력 (더하기 백 스페이스, 삭제, 앞으로 / 뒤로 키) 전용이지만 포인트와 빼기 문자를 포함하도록 쉽게 변경할 수 있습니다.
number () 메소드 와 함께 유효성 검사 플러그인 을 사용할 수 있습니다 .
$("#myform").validate({
rules: {
field: {
required: true,
number: true
}
}
});
숫자 입력 제한을위한 긴 코드가 필요하지 않습니다.이 코드를 사용해보십시오.
또한 유효한 int & float 값을 받아들입니다.
onload =function(){
var ele = document.querySelectorAll('.number-only')[0];
ele.onkeypress = function(e) {
if(isNaN(this.value+""+String.fromCharCode(e.charCode)))
return false;
}
ele.onpaste = function(e){
e.preventDefault();
}
}
<p> Input box that accepts only valid int and float values.</p>
<input class="number-only" type=text />
$(function(){
$('.number-only').keypress(function(e) {
if(isNaN(this.value+""+String.fromCharCode(e.charCode))) return false;
})
.on("cut copy paste",function(e){
e.preventDefault();
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p> Input box that accepts only valid int and float values.</p>
<input class="number-only" type=text />
최신 정보
위의 답변은 가장 일반적인 사용 사례에 대한 것입니다-숫자로 입력을 확인하십시오.
아래는 특별한 사용 사례를위한 코드 스 니펫입니다.
$(function(){
$('.number-only').keyup(function(e) {
if(this.value!='-')
while(isNaN(this.value))
this.value = this.value.split('').reverse().join('').replace(/[\D]/i,'')
.split('').reverse().join('');
})
.on("cut copy paste",function(e){
e.preventDefault();
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p> Input box that accepts only valid int and float values.</p>
<input class="number-only" type=text />
아래는 문자 그대로 키 입력을 차단하는 데 사용하는 것입니다. 숫자 0-9와 소수점 만 허용합니다. 많은 코드가 아니라 구현하기 쉽고 매력처럼 작동합니다.
<script>
function isNumberKey(evt) {
var charCode = (evt.which) ? evt.which : event.keyCode;
if (charCode != 46 && charCode > 31 && (charCode < 48 || charCode > 57)) {
return false;
} else {
return true;
}
}
</script>
<input value="" onkeypress="return isNumberKey(event)">
charCode != 46있다면 if 문에서 제거하여 소수를 제한 할 수 있습니다 . 좋은 대답입니다!
키 다운시 알파벳의 마법 모양과 사라짐이 보이지 않습니다. 이것은 마우스 페이스트에서도 작동합니다.
$('#txtInt').bind('input propertychange', function () {
$(this).val($(this).val().replace(/[^0-9]/g, ''));
});
/[^0-9.]/g
먼저 jQuery를 사용 하여이 문제를 해결하려고 시도했지만 키 입력시 제거되기 직전에 입력 필드에 원하지 않는 문자 (숫자가 아닌)가 실제로 나타나는 것에 대해서는 만족하지 않았습니다.
다른 해결책을 찾고 이것을 찾았습니다.
<script>
function numbersOnly(oToCheckField, oKeyEvent) {
return oKeyEvent.charCode === 0 ||
/\d/.test(String.fromCharCode(oKeyEvent.charCode));
}
</script>
<form name="myForm">
<p>Enter numbers only: <input type="text" name="myInput"
onkeypress="return numbersOnly(this, event);"
onpaste="return false;" /></p>
</form>
출처 : https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers.onkeypress#Example 라이브 예 : http://jsfiddle.net/u8sZq/
단일 소수점을 허용하려면 다음과 같이 할 수 있습니다.
<script>
function numbersOnly(oToCheckField, oKeyEvent) {
var s = String.fromCharCode(oKeyEvent.charCode);
var containsDecimalPoint = /\./.test(oToCheckField.value);
return oKeyEvent.charCode === 0 || /\d/.test(s) ||
/\./.test(s) && !containsDecimalPoint;
}
</script>
출처 : 방금 썼습니다. 작동하는 것 같습니다. 라이브 예 : http://jsfiddle.net/tjBsF/
관심을 가질만한 것들 :
제목이 jQuery 솔루션을 요구한다는 것을 알고 있지만 어쨌든 누군가가 유용 할 것입니다.
게시물 Aaron Aaron Smith에 감사드립니다.
소수점과 숫자의 숫자 부분을 허용하도록 답변을 편집했습니다. 이 작업은 나에게 완벽합니다.
$(".numeric").keypress(function(event) {
// Backspace, tab, enter, end, home, left, right,decimal(.)in number part, decimal(.) in alphabet
// We don't support the del key in Opera because del == . == 46.
var controlKeys = [8, 9, 13, 35, 36, 37, 39,110,190];
// IE doesn't support indexOf
var isControlKey = controlKeys.join(",").match(new RegExp(event.which));
// Some browsers just don't raise events for control keys. Easy.
// e.g. Safari backspace.
if (!event.which || // Control keys in most browsers. e.g. Firefox tab is 0
(49 <= event.which && event.which <= 57) || // Always 1 through 9
(96 <= event.which && event.which <= 106) || // Always 1 through 9 from number section
(48 == event.which && $(this).attr("value")) || // No 0 first digit
(96 == event.which && $(this).attr("value")) || // No 0 first digit from number section
isControlKey) { // Opera assigns values for control keys.
return;
} else {
event.preventDefault();
}
});
window.jQuery.fn.ForceNumericOnly =
function () {
return this.each(function () {
$(this).keydown(function (event) {
// Allow: backspace, delete, tab, escape, and enter
if (event.keyCode == 46 || event.keyCode == 8 || event.keyCode == 9 || event.keyCode == 27 || event.keyCode == 13 ||
// Allow: Ctrl+A
(event.keyCode == 65 && event.ctrlKey === true) ||
// Allow: home, end, left, right
(event.keyCode >= 35 && event.keyCode <= 39)) {
// let it happen, don't do anything
return;
} else {
// Ensure that it is a number and stop the keypress
if (event.shiftKey || (event.keyCode < 48 || event.keyCode > 57) && (event.keyCode < 96 || event.keyCode > 105)) {
event.preventDefault();
}
}
});
});
};
그리고 원하는 모든 입력에 적용하십시오.
$('selector').ForceNumericOnly();
2015 년 10 월 현재 CanIUse에 따르면 HTML5는 전역 브라우저 지원 88 % 이상으로 입력 유형 번호를 지원합니다.
<input type="number" step="0.01" min="0" name="askedPrice" id="askedPrice" />
이것은 JQuery 관련 솔루션은 아니지만 휴대 전화에서 Android 키보드가 숫자를 입력하도록 최적화된다는 이점이 있습니다.
또는 새 매개 변수 "pattern"과 함께 입력 유형 텍스트를 사용할 수 있습니다. HTML5 사양에 대한 자세한 내용
이 질문에서 jquery 솔루션이 수천 구분 기호를 지원하지 않기 때문에 jquery 솔루션보다 낫다고 생각합니다. html5를 사용할 수있는 경우
JSFiddle : https://jsfiddle.net/p1ue8qxj/
이 기능은 동일한 작업을 수행하며 위의 아이디어 중 일부를 사용합니다.
$field.keyup(function(){
var val = $j(this).val();
if(isNaN(val)){
val = val.replace(/[^0-9\.]/g,'');
if(val.split('.').length>2) val =val.replace(/\.+$/,"");
}
$j(this).val(val);
});
/ * 이것은 jQuery를 사용하여 HTML 입력 상자에 숫자 (0-9) 만 허용하는 방법의 크로스 브라우저 버전
입니까?
* /
$("#inputPrice").keydown(function(e){
var keyPressed;
if (!e) var e = window.event;
if (e.keyCode) keyPressed = e.keyCode;
else if (e.which) keyPressed = e.which;
var hasDecimalPoint = (($(this).val().split('.').length-1)>0);
if ( keyPressed == 46 || keyPressed == 8 ||((keyPressed == 190||keyPressed == 110)&&(!hasDecimalPoint && !e.shiftKey)) || keyPressed == 9 || keyPressed == 27 || keyPressed == 13 ||
// Allow: Ctrl+A
(keyPressed == 65 && e.ctrlKey === true) ||
// Allow: home, end, left, right
(keyPressed >= 35 && keyPressed <= 39)) {
// let it happen, don't do anything
return;
}
else {
// Ensure that it is a number and stop the keypress
if (e.shiftKey || (keyPressed < 48 || keyPressed > 57) && (keyPressed < 96 || keyPressed > 105 )) {
e.preventDefault();
}
}
});
parseFloat ()를 통해 내용을 실행하십시오. NaN유효하지 않은 입력으로 돌아갑니다 .
decorplanit.com에서 autoNumeric을 사용할 수 있습니다 . 통화, 반올림 등 숫자를 잘 지원합니다.
CSS 조정이 거의없는 IE6 환경에서 사용했으며 합리적인 성공이었습니다.
예를 들어 CSS 클래스를 numericInput정의 할 수 있으며 숫자 입력 마스크로 필드를 장식하는 데 사용할 수 있습니다.
autoNumeric 웹 사이트에서 수정 :
$('input.numericInput').autoNumeric({aSep: '.', aDec: ','}); // very flexible!
나는 이것이이 문제를 해결하는 좋은 방법이라고 생각하며 매우 간단합니다.
$(function() {
var pastValue, pastSelectionStart, pastSelectionEnd;
$("input").on("keydown", function() {
pastValue = this.value;
pastSelectionStart = this.selectionStart;
pastSelectionEnd = this.selectionEnd;
}).on("input propertychange", function() {
var regex = /^[0-9]+\.?[0-9]*$/;
if (this.value.length > 0 && !regex.test(this.value)) {
this.value = pastValue;
this.selectionStart = pastSelectionStart;
this.selectionEnd = pastSelectionEnd;
}
});
});
예 : JSFiddle
시나리오 다루기
여기에서 가장 유사한 권장 사항은 이들 중 하나 이상에 실패하거나 이러한 모든 시나리오를 다루기 위해 많은 코드가 필요합니다.
home, end그리고 arrow키.delete와 backspace어떤 인덱스에 사용되는.keyup이벤트가 사용되지 않기 때문에 텍스트 값이 깜박 이지 않습니다.시나리오 실패
0.50으로 시작 하고 삭제하면 작동하지 않습니다. 텍스트 상자가 소수점으로 시작할 때 (원하는 경우) 정규 표현식을 변경 /^[0-9]*\.?[0-9]*$/한 다음 흐림 이벤트를 추가하여 이를 해결할 수 있습니다 0. 이 문제를 해결하는 방법에 대한 자세한 내용은이 고급 시나리오 를 참조하십시오 .플러그인
이 간단한 jquery 플러그인 을 만들어 쉽게 만들었습니다 .
$("input").limitRegex(/^[0-9]+\.?[0-9]*$/);
가장 좋은 방법은 포커스를 잃을 때마다 텍스트 상자의 contects를 확인하는 것입니다.
정규식을 사용하여 내용이 "숫자"인지 확인할 수 있습니다.
또는 기본적으로 자동으로 수행되는 유효성 검사 플러그인을 사용할 수 있습니다.
데이터베이스 사용을 위해이 찾기 코드를 확인하십시오.
function numonly(root){
>>var reet = root.value;
var arr1 = reet.length;
var ruut = reet.charAt(arr1-1);
>>>if (reet.length > 0){
var regex = /[0-9]|\./;
if (!ruut.match(regex)){
var reet = reet.slice(0, -1);
$(root).val(reet);
>>>>}
}
}
//Then use the even handler onkeyup='numonly(this)'
이것은 텍스트 필드에서 정수 백분율 유효성 검사를 위해 방금 수행 한 스 니펫 (Peter Mortensen / Keith Bentrup의 코드 일부 사용)입니다 (jQuery 필요).
/* This validates that the value of the text box corresponds
* to a percentage expressed as an integer between 1 and 100,
* otherwise adjust the text box value for this condition is met. */
$("[id*='percent_textfield']").keyup(function(e){
if (!isNaN(parseInt(this.value,10))) {
this.value = parseInt(this.value);
} else {
this.value = 0;
}
this.value = this.value.replace(/[^0-9]/g, '');
if (parseInt(this.value,10) > 100) {
this.value = 100;
return;
}
});
이 코드는 :
이것이 도움이 필요한 사람들에게 도움이되기를 바랍니다.
http://ajax911.com/numbers-numeric-field-jquery/ 에서 훌륭한 솔루션을 찾았습니다.
요구 사항에 따라 방금 "keyup"을 "keydown"으로 변경했습니다.
HTML5를 사용하는 경우 유효성 검사를 수행하기 위해 많은 시간을 들일 필요가 없습니다. 그냥 사용하십시오-
<input type="number" step="any" />
step 속성은 소수점을 유효하게합니다.
입력에서 캐럿 위치를 유지하는 다른 방법 :
$(document).ready(function() {
$('.numbersOnly').on('input', function() {
var position = this.selectionStart - 1;
fixed = this.value.replace(/[^0-9\.]/g, ''); //remove all but number and .
if(fixed.charAt(0) === '.') //can't start with .
fixed = fixed.slice(1);
var pos = fixed.indexOf(".") + 1;
if(pos >= 0)
fixed = fixed.substr(0,pos) + fixed.slice(pos).replace('.', ''); //avoid more than one .
if (this.value !== fixed) {
this.value = fixed;
this.selectionStart = position;
this.selectionEnd = position;
}
});
});
장점 :
플 런커 : 데모 작업
방금 더 나은 플러그인을 찾았습니다. 더 많은 제어 기능을 제공합니다. DOB 필드에 숫자가 필요하지만 "/"또는 "-"문자를 사용할 수 있다고 가정하십시오 .
잘 작동합니다!
http://itgroup.com.ph/alphanumeric/ 에서 확인하십시오 .
$(".numeric").keypress(function(event) {
// Backspace, tab, enter, end, home, left, right
// We don't support the del key in Opera because del == . == 46.
var controlKeys = [8, 9, 13, 35, 36, 37, 39];
// IE doesn't support indexOf
var isControlKey = controlKeys.join(",").match(new RegExp(event.which));
// Some browsers just don't raise events for control keys. Easy.
// e.g. Safari backspace.
if (!event.which || // Control keys in most browsers. e.g. Firefox tab is 0
(49 <= event.which && event.which <= 57) || // Always 1 through 9
(48 == event.which && $(this).attr("value")) || // No 0 first digit
isControlKey) { // Opera assigns values for control keys.
return;
} else {
event.preventDefault();
}
});
이 코드는 꽤 잘 작동했습니다. 제어 키 배열에 46을 추가해야 마침표를 사용할 수는 있지만 최선의 방법이라고 생각하지는 않습니다.)
나는 이것을 좋은 결과와 함께 사용했다.
ini=$("#id").val();
a=0;
$("#id").keyup(function(e){
var charcode = (e.which) ? e.which : e.keyCode;
// for decimal point
if(!(charcode===190 || charcode===110))
{ // for numeric keys andcontrol keys
if (!((charcode>=33 && charcode<=57) ||
// for numpad numeric keys
(charcode>=96 && charcode<=105)
// for backspace
|| charcode==8))
{
alert("Sorry! Only numeric values allowed.");
$("#id").val(ini);
}
// to include decimal point if first one has been deleted.
if(charcode===8)
{
ini=ini.split("").reverse();
if(ini[0]==".")
a=0;
}
}
else
{
if(a==1)
{
alert("Sorry! Second decimal point not allowed.");
$("#id").val(ini);
}
a=1;
}
ini=$("#id").val();
});
find keycodes at http://www.cambiaresearch.com/articles/15/javascript-char-codes-key-codes