이번편은 지난번 생년월일 입력 이벤트를 활용하여 카드번호 입력 후 4자리마다 하이픈 또는 공백등의 구분자를 붙여는 스크립트 예제에 대해서 알아보자.
참고로 기본적인 기능들은 앞서 생년월일 입력 이벤트와 유사하며 이를 조금만 활용하면되고 다만 카드 입력의 경우 보안이 중요한 만큼 마스크처리를 추가하였다.
<style>
input[type="text"]{ width:100%; max-width:450px; padding:6px 2px; border:solid 1px cornflowerblue; outline: none;; }
</style>
<h3>카드 ex1) 1234-5678-9123-4567 </h3>
<input type="text" class="cardnum" value="" data-backspace="false">
<br><br>
<h3>카드 ex2) 1234-****-****-4567 </h3>
<input type="text" class="cardnum" value="" data-mask2="*" data-mask3="*">
<br><br>
<h3>카드 ex3) 1234 5678 9123 4567 </h3>
<input type="text" class="cardnum" value="" data-seq=" ">
<h3>카드 ex4) 1234 *** **** 4567 </h3>
<input type="text" class="cardnum" value="" data-seq=" " data-mask2="*" data-mask3="*">
<script>
// 유효성 체크
function valid(e){
let dataset = e.target.dataset;
let formatLen = 16;
let input = '';
input = e.target.value.replace(/[^0-9]/g, '');
if( input.length <= 0 ){ return input; }
input = input.substring(0,formatLen);
return input;
}
window.onload = function(){
let eventEles = document.querySelectorAll('.cardnum');
eventEles.forEach(function(v,i){
if( typeof v.dataset.seq == 'undefined' || v.dataset.seq == '' || v.dataset.seq.length > 1){ v.dataset.seq = '-'; }
if( typeof v.dataset.backspace == 'undefined' || v.dataset.backspace == '' || v.dataset.backspace != 'false'){ v.dataset.backspace = 'true'; }
for(k=1;k<=4;k++){
if( typeof v.dataset['mask'+k] == 'undefined' || v.dataset['mask'+k] == '' || v.dataset['mask'+k].length > 1){
v.dataset['mask'+k] = '';
v.dataset['maskSet'+k] = '$'+k;
}
else{
v.dataset['maskSet'+k] = v.dataset['mask'+k].repeat(4);
}
}
v.setAttribute('maxlength',19);
v.addEventListener('input',function(e){
let dataset = e.target.dataset;
let formatLen = 16;
let input = valid(e);
if( input.length < formatLen){
if(typeof dataset.value != 'undefined' ){
input = dataset.value;
if( dataset.backspace == 'true'){
input = input.substring(0,input.length-1);
}
e.target.removeAttribute('data-value');
}
e.target.value = input;
return false;
}
e.target.setAttribute('data-value',input);
input = input.replace(/(\d{4})(\d{4})(\d{4})(\d{4})/, dataset.maskSet1+dataset.seq+dataset.maskSet2+dataset.seq+dataset.maskSet3+dataset.seq+dataset.maskSet4);
e.target.value = input;
});
v.addEventListener('blur',function(e){
let dataset = e.target.dataset;
let formatLen = 16;
let formatSeqLen = 19;
let input = e.target.value;
input = valid(e);
if( input.length != formatLen){ return false; }
e.target.setAttribute('data-value',input);
input = input.replace(/(\d{4})(\d{4})(\d{4})(\d{4})/, dataset.maskSet1+dataset.seq+dataset.maskSet2+dataset.seq+dataset.maskSet3+dataset.seq+dataset.maskSet4);
e.target.value = input;
});
});
};
</script>
예제 페이지를 보면 확인 할 수 있겠지만 카드번호 16자리를 입력하고 나면 자동으로 구분자가 채워지게 되어있다. 그리고 백스페이스(삭제)키를 누르면 구분자가 사라지고 숫자형태가 다시 보여지게 되어있다.
카드번호 이벤트도 생년월일 이벤트와 같이 input 태그에서 data 속성을 통해 옵션을 줄 수 있는데 옵션의 기본 사용방법은 생년월일 이벤트와 동일하며 추가적으로 마스킹 처리 옵션이 추가되었으니 참고하도록 하자.
속성 | data-seq
<input type="text" class="cardnum" value="" data-seq="-">
속성 | data-mask*
<input type="text" class="cardnum" value="" data-mask2="*" data-mask3="*">
속성 | data-backspace
<input type="text" class="birthday" value="" data-backspace="false" >
추가로 이벤트를 보면 blur가 추가되었는데 이는 backspace 옵션이 false 일경우 삭제하고 나면 숫자형태로 그대로 남기 때문에 영역을 벗어나면 다시 구분자를 붙여주기 위해 추가하였다.