2016-10-29 2 views
0

Firefox에서 자주 발생하는 바닐라 자바 ​​스크립트 코드를 정리하는 데 도움이 필요합니다.숫자 전용 자바 스크립트 파이어 폭스 솔루션

다음/keyCode 검사는 input 또는 textarea에 숫자 만 허용하는 가장 일반적인 바닐라 JS 솔루션에 대한 것 같습니다.

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

태그로 onkeypress="return function(event);"을 통해 호출됩니다.

그러나 Firefox는 다른 브라우저처럼 onkeyuponkeydown이 아닌 onkeypress 호출로 화살표 키를 바인딩합니다. 이는 예를 들어 왼쪽 화살표 키 charCode37이지만 % (shift + 5)는 charCode입니다. 더 중요한 것은 화살표 키를 탐색 (캐럿/텍스트 커서를 왼쪽이나 오른쪽으로 이동)에 사용할 수 없다는 것입니다.

그러나, 차이 (http://www.asquare.net/javascript/tests/KeyCode.html에 도시 된 바와 같이) %가 charCode37which있는 동안 왼쪽 화살표 키, keyCode 37을 갖는다는 것이다. 그래서 다음을 수행하여 화살표 키가 잘 작동 할 수 있었다 그러나

if (charcode > 31 && (charcode < 48 || charcode > 57)) { 
if (e.keycode && e.keyCode > 36 && e.keyCode < 41) { 
    return true; 
} 
    return false; 
} 
return true; 

, 내가 그것을 할 수있는 최선의 또는 깨끗한 방법은 아니며, 더 키가 다르게 처리가 될 수 있음을 느낌 파이어 폭스는 화살표 키보다 더 깨끗한 바닐라 JS 솔루션 또는이 기능 내에서 화살표 키를 최소한으로 확인하는 방법은 무엇입니까?

감사합니다.


편집 : 난 그냥 코드가 파이어 폭스를 해결하더라도 이들 지금 charCodes 37-40 (즉, %)을 입력 할 수 있습니다, 그것은 다른 모든 브라우저에 대한 새로운 문제를 도입한다는 생각. keyCode을 확인하는 대신 charCode 또는 which을 확인해야합니다. 그렇지 않은 경우 동일한 방법으로 확인하십시오.

+0

당신이 '이 있다는 것을 알고 계십니까 :이 화살표 키, 백 스페이스, ... 선택 등의 작업을 삭제하는 방법에 나쁜 영향을 동일한 사용자 경험을 제공하지 않으며,이 '?특정 키를 차단하는 것은 사용자 친화적이지 않으므로 키보드가 깨 졌다고 생각할 수 있습니다. 또한, 그들은 여전히 ​​(상황에 맞는 메뉴를 통해) 복사/붙여 넣기를 사용할 수 있으므로 끝내지 않을 것입니다. 그대로 사용자 입력을 그대로 받아 들인 다음 색상 표시 또는 입력 근처의 메시지를 통해 나중에 유효성을 검사하는 것이 좋습니다. – trincot

+0

나는 그것을 알고있다. 그러나 그것은 정말로 여기의 필요에 어울리지 않을 것이다. 또한, 내가 말할 수있는 것부터, 다른 비 문자 키는 'onkeydown'과 'onkeyup'이 아닌, 잘 작동하는 것으로 보인다. (애 태움, 단지 input/textarea와 떨어져있는 'onkeypress'일 뿐이다.) It 's 분명한 숫자 만 입력해야하며 복사/붙여 넣기의 경우에는 텍스트를 숫자로 다시 설정합니다. 그러나 화살표 네비게이션은 꼭 있어야하며 파이어 폭스는 저 작업을 잘 수행하는 것에 대해 걱정할 정도로 인기있는 브라우저입니다. –

+0

원래 코드가 의도 한 다른 문자를 입력하지 못하도록 (단지 입력이 아니라) 입력 된 숫자 만 사용하여 원본 코드를 찾았 기 때문에 원래 코드를 찾았습니다 (또한 입력 대신 텍스트 영역에 대해서도 수행함) . 그러나 원래의 코드를 사용하는 것이 가장 쉬운 방법이었습니다. 문제 해결을 위해 해결책을 물어 보는 것이 가장 좋았습니다. 그것을 지우는 희망. :) –

답변

2

사용자 경험을 저하시키는 느낌이 들기 때문에 특정 키를 차단하지 말 것을 권합니다. 그러나 이것이 당신이 필요로하는 것이라면, keyCode 속성에 의존하지 말 것을 제안합니다. 뿐만 아니라 이와 관련된 호환성 문제, 또한이 입력은 마우스와 상황에 맞는 메뉴와 같이 할 수있는 모든 방법을 포함하고, deprecated하지 않습니다됩니다

이 기능은 웹 표준에서 제거되었습니다.

KeyboardEvent.keyCode 판독 전용 속성

대신 I는 입력 값에 대한 모든 변화를 트리거 input 이벤트를 사용하는 것을 제안하는 시스템 및 구현 종속 수치 코드를 나타내며, 다음의 값을 정리 첫 번째 문제가되는 문자가있는 위치에 커서를 놓습니다.

document.querySelector('#num').addEventListener('input', function() { 
 
    var badCharPos = this.value.search(/\D/); 
 
    if (badCharPos == -1) return; // all OK 
 
    // remove offending characters: 
 
    this.value = this.value.replace(/\D/g, ''); 
 
    this.setSelectionRange(badCharPos, badCharPos); 
 
});
<input id="num">

관련 문제