<input type =“number”> 필드에서 원시 값을 얻는 방법은 무엇입니까?


117

필드 의 "실제" 값을 어떻게 얻을 수 <input type="number">있습니까?


나는이 input상자를, 그리고 난 새로운 HTML5 입력 유형을 사용하고 있습니다 number:

<input id="edQuantity" type="number">

이것은 대부분 Chrome 29에서 지원됩니다.

여기에 이미지 설명 입력

내가 지금 필요한 것은 사용자가 입력 상자에 입력 한 "원시" 값 을 읽을 수있는 기능 입니다. 사용자가 번호를 입력 한 경우 :

여기에 이미지 설명 입력

그러면 edQuantity.value = 4모든 것이 잘됩니다.

그러나 사용자가 잘못된 텍스트를 입력하면 입력 상자를 빨간색으로 표시하고 싶습니다.

여기에 이미지 설명 입력

불행히도 type="number"입력 상자의 경우 텍스트 상자의 값이 숫자가 아니면 value빈 문자열 을 반환합니다.

edQuantity.value = "" (String);

(최소한 Chrome 29에서)

컨트롤 의 "원시" 값을 어떻게 얻을 수 <input type="number">있습니까?

입력 상자의 다른 속성에 대한 Chrome의 목록을 살펴 보았습니다.

여기에 이미지 설명 입력

실제 입력과 유사한 것을 보지 못했습니다.

상자가 "비어 있는지 " 알 수있는 방법도 찾을 수 없습니다. 아마도 내가 추론 할 수 있었다.

value          isEmpty        Conclusion
=============  =============  ================
"4"            false          valid number
""             true           empty box; not a problem
""             false          invalid text; color it red

참고 : 수평 규칙 이후의 모든 것을 무시할 수 있습니다. 질문을 정당화하는 것은 단지 필러 일뿐입니다. 또한 : 예제를 질문과 혼동하지 마십시오. 사람들은 이유는이 질문에 대답 할 수 있습니다 다른 상자 붉은 색칠 이상을 (하나의 예 : 텍스트를 변환 "four"라틴어로 "4"및 onblur 이벤트 기간 동안 기호)

컨트롤 의 "원시" 값을 어떻게 얻을 수 <input type="number">있습니까?

보너스 읽기


2
숫자 입력 필드의 '실제'값은 숫자 여야합니다. 숫자 값 이외의 입력을 허용 number하려면 찾고있는 입력 유형이 아닙니다. 일반 text입력을 사용하십시오 .
robertc

7
@robertc Chrome은 숫자 이외의 입력을 허용하는 에이전트입니다. 숫자가 아닌 다른 것을 입력 했다는 것만 알면 됩니다.
Ian Boyd

1
필드의 validity상태를 확인하십시오 -예상 typeMismatch했지만 직접 확인하지 않았습니다.
robertc

2
@ 읽기 int32_t 여섯 번째 라인 아래로 (즉, "그러나 사용자가 입력하면 ..." )
이안 보이드

6
내 사용 사례 ... 위도와 경도라는 두 개의 숫자 필드가 있습니다. 누군가 "lat, lon"으로 붙여넣고 적절하게 처리하는지 감지하고 싶습니다. 이것은 현재 type = "number"에서는 불가능합니다. "lat, lon"은 유효하지 않기 때문에 .. 정규식을 수행하기 위해 "원시"값을 가져올 수있는 방법이 없습니다. 또 다른 사용 사례 : 고객 오류 표시 : " blah은 잘못된 번호입니다."
브래드 켄트

답변:


55

WHATWG 에 따르면 유효한 숫자 입력이 아니면 값을 가져올 수 없습니다. 입력 숫자 필드의 삭제 알고리즘은 입력이 유효한 부동 소수점 숫자가 아닌 경우 브라우저가 값을 빈 문자열로 설정해야한다고 말합니다.

값 위생 알고리즘은 다음과 같다 다음 경우 요소의가 아닌 유효한 부동 소수점 숫자 다음 대신 빈 문자열로 설정합니다.

유형 지정 (<input type="number"> )을 브라우저에 몇 가지 작업을 요청하는 것입니다. 반면에 숫자가 아닌 입력을 캡처하여 작업을 수행하려면 이전에 시도 된 실제 텍스트 입력 필드에 의존하여 콘텐츠를 직접 구문 분석해야합니다.

W3는 동일한 사양을 가지고 있으며, 추가 :

사용자 에이전트는 사용자가 유효한 부동 소수점 숫자가 아닌 비어 있지 않은 문자열로 값을 설정하도록 허용해서는 안됩니다.


6
사용자 에이전트가 사용자가 유효한 부동 소수점 숫자가 아닌 비어 있지 않은 문자열로 값을 설정하도록 허용하지 않은 경우 유용합니다. 그러나 whatwg가 그것을 할 수 없다고 말한다면; 그게 답입니다. 현재 필요에 대한 해결 방법이 아래에 추가되었습니다.
Ian Boyd

57
유형 ( <input type="number">)을 지정하면 브라우저에 몇 가지 작업을 요청하는 것입니다. 개인적으로 저는 모바일 브라우저에 숫자 키패드를 보여달라고 요청했고, 불쾌한 추가로 유효성 검사를 받았습니다. 이러한 문제의 대부분은 type속성이 표시 할 입력 메커니즘에 대한 유효성 검사 규칙과 규칙을 모두 결정 한다는 사실에서 비롯 되지만 데스크톱 사용자에게 적용되는 숫자 유효성 검사를 원하지 않고 모바일 사용자에게 숫자 키보드를 표시 할 수 있습니다. HTML 5.1은 적어도 inputmode속성을 사용 하여이 문제를 해결 합니다.
Mark Amery 2014

4
그러나 브라우저가 충분하지 않으면 그것을 완료 할 수 있기를 바랍니다. 입력에서 공백 제거, 소수점 유추 등 ...
njzk2

1
또한 프랑스어와 같은 다양한 언어에는 숫자에 대해 2 개의 단어가 있습니다. 하나는 신용 카드 번호와 같은 식별자로서의 숫자를위한 것이고 다른 하나는 부동 소수점 숫자와 같은 숫자를 세기위한 것입니다.
njzk2

1
@MotiKorets는 iPhone이 키보드에 소수점을 넣지 않기 때문에 부동 소수점 숫자를 입력하는 데 작동하지 않습니다. 안타깝게도 개발자들은 멋진 부동 소수점 입력 UX를 제공하는 한 현재로서는 꽤 망가졌습니다.
Andy

50

질문에 대한 답변은 아니지만 유용한 해결 방법은

edQuantity.validity.valid

ValidityState객체의 사용자가 입력 한에 대한 단서를 제공합니다. type="number"a minmax세트 로 입력 고려

<input type="number" min="1" max="10">

우리는 항상 사용하려는 .validity.valid.

다른 속성은 보너스 정보 만 제공합니다.

User's Input  .value  .valid | .badInput  .rangeUnderflow  .rangeOverflow
============  ======  ====== | =========  ===============  ==============
""            ""      true   | false      false            false  ;valid because field not marked required
"1"           "1"     true   | false      false            false  
"10"          "10"    true   | false      false            false
"0"           "0"     false  | false      true             false  ;invalid because below min
"11"          "11"    false  | false      false            true   ;invalid because above max
"q"           ""      false  | true       false            false  ;invalid because not number
"³"           ""      false  | true       false            false  ;superscript digit 3
"٣"           ""      false  | true       false            false  ;arabic digit 3
"₃"           ""      false  | true       false            false  ;subscript digit 3

사용하기 전에 브라우저가 HTML5 유효성 검사를 지원하는지 확인해야합니다.

function ValidateElementAsNumber(element)
{
   //Public Domain: no attribution required.
   if ((element.validity) && (!element.validity.valid))
   {
      //if html5 validation says it's bad: it's bad
      return false;
   }

   //Fallback to browsers that don't yet support html5 input validation
   //Or we maybe want to perform additional validations
   var value = StrToInt(element.value);
   if (value != null)
      return true;
   else
      return false;
}

보너스

Spudly가 삭제 한 유용한 답변이 있습니다.

이를 위해 CSS :invalid선택기를 사용하십시오.

input[type=number]:invalid {
    background-color: #FFCCCC;
}

숫자가 아닌 유효한 값이 입력 될 때마다 요소가 빨간색으로 바뀌도록 트리거합니다.

에 대한 브라우저 지원은와 <input type='number'>거의 동일 :invalid하므로 문제가 없습니다.

:invalid 여기 에 대해 자세히 알아 보십시오 .


Opera에서는 작동하지 않습니다. 그것은 말했다 유효한 경우에도 당신이 입력 할 문자열.
Bergi

Opera는 .validity속성을 지원 하지만 올바르게 처리하지 않습니다 .valid?!
Ian Boyd

하지만 숫자 입력이 언제 유효하지 않습니까? 입력이 비어있는 것처럼 작동합니다. A typeMismatch가 의미가있을 수 있지만 이는 이메일 또는 URL 유형에만 해당됩니다…
Bergi

@Bergi 위의 표는 숫자 입력이 유효하지 않을 수있는 예를 제공합니다. "q", "11"(최대 값은 10), "0"(최소값이 1 인 경우), ""(다음 요소는 required)
Ian 보이드

1
@Bergi .badInput 2012 년 11 월 20 일 에 추가되었습니다 . 그러나 아무도 badInput입력이 유효한지 살펴보면 안됩니다 . 그들은를보고 있어야합니다 .valid. 것이 가능 (정정)는 .badInput거짓, 여전히 잘못된 입력을 할 수 있습니다. .valid유효성 검사 오류 (예 : 불일치, 오버플로, 언더 플로)가없는 것으로 정의되며, 그중 .badInput한 가지 오류 일뿐입니다. 위의 차트 .badInput는 false이지만 입력은 여전히 ​​유효하지 않습니다.
Ian Boyd


4

키 코드를 기반으로 눌린 모든 키 추적

키업 이벤트를 듣고 키 코드를 기반으로 입력 된 모든 문자의 배열을 유지할 수 있다고 가정합니다. 그러나 그것은 매우 지루한 작업이며 아마도 버그가 발생하기 쉽습니다.

http://unixpapa.com/js/key.html

입력을 선택하고 선택을 문자열로 가져옵니다.

document.querySelector('input').addEventListener('input', onInput);

function onInput(){
  this.select(); 
  console.log( window.getSelection().toString() )
}
<input type='number'>

모든 크레딧 : int32_t


이 솔루션은 다른 곳에서 시도되었지만 작동하지 않습니다 . 특히 사용자 프레스 Delete, Backspace, Ctrl+X, Ctrl+V, Right-click-cut, Right-click-paste.
Ian Boyd

기본적으로 OP가 요청한 것은 불가능합니다. 그러나 내가 언급 한 두 가지 해킹 (그리고 그것들은 해킹, 나는 그것을 부정하지 않는다)은 어느 정도 작동한다. 어떤 경우에는 누군가에게 유용 할 수 있습니까?
sandstrom

놀랍게도 선택이 작동하는 것 같습니다. 그 방법의 한계는 무엇입니까?
njzk2

제한 : 텍스트가 시각적으로 선택됩니다. 사용자가 무언가를 입력하면 콘텐츠가 사라집니다
fregante

이 방법이 얼마나 나쁜지 보여주는 라이브 데모로 편집 됨
vsync
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.