개발자 미니민의 개발스터디

[javascript] 키보드 관련 이벤트 / 키보드 이벤트 예제

by mini_min
[javascript] 키보드 관련 이벤트 / 키보드 이벤트 예제

✔️ 키보드 관련 이벤트

: 키보드 이벤트는 키보드와 사용자가 상호 작용하여 발생하는 이벤트를 나타낸다.

 

👩‍💻 keydown : 키를 눌렀을 때 발생

👩‍💻 keyup : 키를 눌렀다 떼었을 때 발생한다.

👩‍💻 keypress : 키보드를 눌렀을 때 발생 (이 이벤트는 권장x)

 

: keypress : a키는 97, A키는 65

: keydown, keyup 이벤트는 keyCode 속성으로 대소문자를 구분할 수 없음

: keypress 는 실제 눌러진 키보드를 반환한다.

 

📓 주요 속성

- altKey : 키 이벤트가 트리거 되었을 때 alt 키 눌렀는지 여부 반환

- ctrlKey : 키 이벤트가 트리거 되었을 때 ctrl 키 눌렀는지 여부 반환

- shiftKey : 키 이벤트가 트리거 되었을 때 shift 키 눌렀는지 여부 반환

- code : 키보드의 실제 키값을 반환한다.

- key : 이벤트로 표시된 키의 키 값을 문자열로 반환한다.

- keyCode : onkeypress 이벤트를 트리거 한 키의 유니코드 문자코드 또는 onkeydown 또는 onkeyup 이벤트를 트리거 한 키의 유니코드의 키 값을 반환한다. (사용 권장 ❌)

 

const inputs = document.getElementById("inputs");
const layout = document.getElementById("layout");
inputs.onkeydown = function(e){
let keyCode = e.keyCode;
// a를 누르면 65, A를 누르면 65
let key = e.key; // 모든 브라우저가 지원하지 않음
// a를 누르면 'a', A를 누르면 'A'
let s = "keydown:" + keyCode + ", " + key + "<br>";
layout.innerHTML += s;
}
// ASCII 관련키에만 발생한다.
inputs.onkeypress = function(e){
let keyCode = e.keyCode;
// a를 누르면 97, A를 누르면 65
let key = e.key; // 모든 브라우저가 지원하지 않음
// a를 누르면 'a', A를 누르면 'A'
let s = "keypress:" + keyCode + ", " + key + "<br>";
layout.innerHTML += s;
}
//ASCII 관련키에만 발생한다.
inputs.onkeyup = function(e){
let keyCode = e.keyCode;
// a를 누르면 65, A를 누르면 65
let key = e.key; // 모든 브라우저가 지원하지 않음
// a를 누르면 'a', A를 누르면 'A'
let s = "keyup:" + keyCode + ", " + key + "<br>";
layout.innerHTML += s;
}
💡 onkeyup 과 onkeydown 은 대소문자 구분을 못한다.

 

 

✔️ 키보드 이벤트 예제

1) 숫자만 입력가능

2) 영문자만 입력가능

3) 영문, 숫자만 가능

4) 한글만 입력가능

<p> 숫자만 : <input type="text" class="inputNum"></p>
<p> 영문만 : <input type="text" class="inputAlph"></p>
<p> 영문,숫자만 : <input type="text" class="inputAlphNum"></p>
<p> 한글만 : <input type="text" class="inputKor"></p>

 

1) 숫자만 입력가능

👩‍💻 keyCode 로 입력 값을 받고, 숫자가 아닌 값을 받으면 preventDefault 로 중단한다.

function onlyNumber(e){
let key = e.key || e.keyCode;
//한글 들어가는거 막을 방법이 없다 ;
if(key < '0' || key > '9') {
e.preventDefault();
}
}

 

2) 영문자만 입력가능

👩‍💻 유니코드로 a~z , A~Z 사이만 입력되도록 설정한다.

function onlyAlph(e) {
if((e.keyCode<65 || e.keyCode>90) && (e.keyCode<97 || e.keyCode>122)){
e.preventDefault();
}
}

 

3) 영문, 숫자만 가능

👩‍💻 \w 는, 영숫자, 언더바, 달러기호 입력되도록 하는 정규식

 

function onlyAlphNum(e){
// \w : 정규식(영숫자, _, $)
if(!/^\w{1}$/.test(e.key) ){
e.preventDefault();
}
}

 

4) 한글만 입력가능

function onlyKorean(e){
if(e.keyCode < 12592 || e.keyCode > 12687 ){
e.preventDefault();
}
}

 

 

✔️ 한글 입력되지않도록 지우는 함수

function deleteKorean(e) {
// bs, tab, <, >, delete
if(e.keyCode ==8 || e.keyCode ===9 || e.keyCode===37
|| e.keyCode===39 || e.keyCode ===46 ){
return;
}
let obj = e.currentTarget;
//자음, 모음, 한글을 제거
obj.value = obj.value.replace(/[ㄱ-ㅎㅏ-ㅣ가-힣]/g, '');
}

 

 

✔️ 이후 윈도우 객체에 addEventListener 이벤트 등록(load)

window.addEventListener("load", function(){
let inputEl;
inputEl = document.querySelector('.inputNum');
inputEl.addEventListener('keypress', e=> onlyNumber(e));
inputEl.addEventListener('keyup', e=> deleteKorean(e));
inputEl = document.querySelector('.inputAlph');
inputEl.addEventListener('keypress', e=> onlyAlph(e));
inputEl.addEventListener('keyup', e=> deleteKorean(e));
inputEl = document.querySelector('.inputAlphNum');
inputEl.addEventListener('keypress', e=> inputAlphNum(e));
inputEl.addEventListener('keyup', e=> deleteKorean(e));
inputEl = document.querySelector('.inputKor');
inputEl.addEventListener('keypress', e=> onlyKorean(e));
});

 

 

✔️ 한글 입력 제한

<p> 한글 제한 : <input type="text" class="notKorean"> </p>
<p> 한글 제한 : <input type="text" class="notKorean"> </p>
<p> 한글 제한 : <input type="text" class="notKorean"> </p>
const inputEls = document.querySelectorAll(".notKorean");

 

1) 각각의 input 객체에 input 이벤트를 forEach 로 각각 넣는다. (input 객체 여러개를 받은거라 forEach 사용 가능)

2) 현재 객체를 가리키도록 let obj = e.currentTarget;

3) obj 의 value 값에 한글이 입력되면 지워야하기 때문에 obj.value.replace(/[\W]/g, "")

✨ \W : 영숫자가 아닌 경우 (\w(영문자 숫자...)가 아닌 문자열만 선택한다는것이다.) 

const inputEls = document.querySelectorAll(".notKorean");
inputEls.forEach(function(item){
item.addEventListener('input', function(e){
let obj = e.currentTarget;
obj.value = obj.value.replace(/[\W]/g, ""); //\W : 영숫자가 아닌 경우
});
});

 

 

 

 

 

블로그의 프로필 사진

블로그의 정보

개발자 미니민의 개발로그

mini_min

활동하기