Front/Js
JavaScript(이벤트, Event, 회원가입 유효성 검사, 정규표현식)
devel0per
2022. 9. 27. 14:56
이벤트(Event)
1. 이벤트 모델의 종류
- 고전 이벤트 모델
- 인라인 이벤트 모델
- 표준 이벤트 모델
1-1)고전 이벤트 모델
- 요소 객체를 가지고 와서 해당 요소객체에 이벤트 속성에 접근한 후 이벤트 핸들러를 연결하는 방식 이벤트를 제거할 수도 있음(이벤트 속성에 null값 대입)
- document.getElementById()를 활용해서 해당 요소객체에 이벤트 핸들러를 연결한다(document.getElementsByName.. 등 사용가능)
<!--요소 내부에 직접적으로 이벤트 속성을 기술하지 않는다-->
<button id="btn1">버튼1</button>
<button id="btn2">버튼1 이벤트 삭제</button>
<div id="area1" class="area"></div>
<script>
var area1 = document.getElementById("area1");
// var btn1 = document.getElementById("btn1");
// btn1.onclick = function(){
// }
document.getElementById("btn1").onclick = function(){ //버튼1을 클릭했을때 btn1이 클릭되었습니다 메세지 넣기
area1.innerHTML+="btn1이 클릭되었습니다. <br>";
}
document.getElementById("btn2").onclick=function(){ //버튼2를 클릭했을때 버튼1의 이벤트를 삭제하기
document.getElementById("btn1").onclick=null; // 이벤트 제거
}
document.getElementById("btn1").onmouseover=function(){
area1.style.backgroundColor="yellow";
}
document.getElementById("btn1").onclick = function(){
area1.innerHTML+="btn1이 클릭되었습니다람쥐. <br>";
}
</script>
1-2)인라인 이벤트 모델
- 요소 내부에 직접적으로 이벤트 속성을 제시해서 실행할 내용을 정의하는 방식 주로 script 태그에 정의되어 있는 함수를 호출하는 방식으로 사용한다.
<h3>인라인 이벤트 모델</h3>
<p>
요소내부에 직접적으로 이벤트 속성을 제시해서 실행할 내용을 정의하는 방식 <br>
주로 script 태그에 정의되어 있는 함수를 호출하는 방식으로 사용
</p>
<button onclick="test01();">확인</button>
<button onclick="document.getElementById('area2').innerHTML+='두번째 버튼 클릭 <br>';">2번확인</button>
<!--요소내부에 직접적으로 이벤트를 기술해도 되지만 구문이 길어지고 복잡하기때문에 사용하지 않음-->
<div id="area2" class="area"></div>
<script>
function test01(){
document.getElementById("area2").innerHTML+="첫번재 버튼 클릭 <br>";
}
</script>
1-3)표준 이벤트 모델(addEventListener)
- 이벤트를 걸고자하는 요소객체에 addEventListener("이벤트명", "이벤트핸들러")를 사용한다.
<h3>표준 이벤트 모델 (addEventListener)</h3>
<button id="btn3">확인</button>
<script>
var btn3 = document.getElementById("btn3");
//이벤트를 걸고자하는 요소객체.addEventListener("이벤트명","이벤트핸들러"); //j)이벤트핸들러는 함수 어떠하게 함수를 다룰지
btn3.addEventListener("click",function(){
alert("표준이벤트 모델 테스트");
});
//버튼 안으로 마우스포인터가 들어가는 순간 발생하는 이벤트 : mouseeenter
btn3.addEventListener("mouseenter",function(){
btn3.style.backgroundColor="red";
});
//버튼 밖으로 마우스포인터가 빠져나가는 순간 발생하는 이벤트 :mouseout
btn3.addEventListener("mouseout",function(){
btn3.style.backgroundColor="blue";
});
//마우스를 누르고 있을때
btn3.addEventListener("mousedown",function(){
btn3.style.backgroundColor="yellow";
});
btn3.addEventListener("click",function(){
alert("표준이벤트 모델 테스트22");
});
//-> 고전은 중복 x, 표준은 중복 O
</script>
2. 현재 이벤트가 발생한 요소객체에 접근하는 방법
- 고전 이벤트 방식
- function(e) 이벤트 핸들러를 이용해서 이벤트 발생시 내부적으로 정보가 전달되게 만든다.
- 현재 이벤트가 발생한 요소객체를 가져오고자 한다면 window.event.target = e.target = this를 사용하면 된다.
- e = window.event; window.event라는 객체정보가 내부적으로 넘어가는데 그것을 매개변수로 담아서 넘기는 형태이다.
<h2>2.현재 이벤트가 발생한 요소객체에 접근하는 방법</h2>
<button id="btn4">고전이벤트방식</button>
<button onclick="test03(this);">버튼요소전달</button>
<script>
//고전 이벤트 방식
document.getElementById("btn4").onclick = function(e){ //이벤트 핸들러
// console.log(window.event); //이벤트 발생시 내부적으로 정보가 전달됨 (매개변수처럼)
// console.log(e);
//현재 이벤트가 발생한 요소객체를 가져오고자 한다면
// window.event.target = e.target = this
//e=window.event; window.event라는 객체정보가 내부적으로 넘어가는데 그것을 매개변수로 담아서 넘기는 형태
console.log(window.event.target);
console.log(e.target);
console.log(this);
window.event.target.style.backgroundColor="black";
e.target.innerHTML = "버튼클릭됨";
this.style.color = "white";
alert(this.id);
}
- 표준 이벤트 모델 방식
<h2>2.현재 이벤트가 발생한 요소객체에 접근하는 방법</h2>
<button id="btn5">표준이벤트방식</button>
<button onclick="test03(this);">버튼요소전달</button>
<script>
//표준 이벤트 모델 방식
document.getElementById("btn5").addEventListener("click",function(e){
console.log(window.event.target);
console.log(e.target);
console.log(this);
});
- 인라인 이벤트 모델 방식
- 인라인 방식은 태그내에서 직접 호출하기 때문에 호출시 매개변수를 같이 넣지 않는다.
- this가 window객체 정보를 가지고 있다
- 고전방식과 표준방식은 해당요소객체(버튼), 이벤트 호출이기떄문에 this로 버튼을 불러올수 있지만 일반 선언적 함수를 호출하는 인라인 이벤트 방식은 window.event.target만 가능하다.
function test02(){
console.log(window.event.target);
// console.log(e.target); //호출시 매개변수를 같이 넣지 않았기 때문 / 인라인방식은 태그내에서 직접 호출하기때문
console.log(this); //window객체정보를 갖고있음
//고전방식과 표준방식은 해당요소객체(버튼).이벤트 호출이기때문에 this로 버튼을 불러올수있지만
//일반 선언적 함수를 호출하는 인라인 이벤트 방식은 window.event.target만 가능하다
}
function test03(element){
// console.log(element);
element.innerHTML="this로 전달받음";
}
3. 태그별 기본적으로 가지고 있는 이벤트 제거
기본적으로 이벤트를 가지고 있는요소
- <a> : 클릭시 href에 제시되어있는 url을 요청하는 기본이벤트 보유
- <form submit> : 클릭 시 사용자가 입력한 정보들을 action에 제시되어 있는 url에 제출하며 요청하는 이벤트
태그 내의 기본적인 설정값 이벤트를 제거하고자 한다면 이벤트 핸들러의 return값을 false로 리턴해주면 기본이벤트의 실행이 안된다.
- <a> 태그 이벤트 속성 없애기
<!--기본 이벤트가 있는 요소에 onclick속성을 부여하면 onclick이 우선적으로 실행된다-->
<a href="http://www.naver.com" onclick="alert('잠깐!'); return false;">네이버로 이동</a>
- <a> 태그 외부에선 이벤트 속성을 없앨 수 없다 !!
<a href="http://www.naver.com" onclick="test04(); return false;">확인</a> <!--여기에서 return false로 기본이벤트 막아야함-->
<script>
function test04(){
alert("잠깐만요");
//return false; //여기에서 false를 해봐야 의미없음(기본이벤트 실행을 막지 못함)
}
4. 로그인 폼 유효성 검사
폼 생성 조건
- 아이디에 대한 유효성 검사
- 아이디가 5~12 글자 사이인지 확인
- 아이디가 영문자 또는 숫자로만 되어있는지 확인
- 맞지 않을경우 return false를 보내서 기본 이벤트(전송) 실행을 막는다.
기본적인 로그인 폼 생성
<form action="test.do" method="get">
아이디 : <input type="text" id="userId" name="userid"><br>
<label for="userid" style="font-size:10px; color:gray;">영문자 또는 숫자로만 총 5~12 사이로 입력하시오</label><br>
비밀번호 : <input type="password" id="userPW" name="userPw"><br>
비밀번호 확인 : <input type="password" name="userPwChk" id="userPwChk"><br>
// onclick 먼저 실행되게 설정.
<input type="submit" value="회원가입" onclick="return validate();">
유효성검사를 위한 메소드구현
<script>
function validate(){
var userId = document.getElementById("userId").value;
var userPw = document.getElementById("userPW").value;
var uwerPwChk = document.getElementById("userPwChk").value;
// 정규표현식을 통한 유효성 검사
var regExp = /^[a-zA-Z0-9]{5,12}$/;
// 정규표현식 객체에서 제공하는 test 메소드
if(!regExp.test(userId)){
alert("유효한 아이디가 아닙니다 다시 입력해주세요");
document.getElementById("userid").select();
return false;
}
if(userPw!=userPwChk){
alert("비밀번호와 비밀번호 확인이 다릅니다.");
return false;
}
}
</script>
- 정규표현식을 사용하지 않고 유효성 검사를 실행했으면 어땠을까?
if(userId.length >= 5 && userId.length <= 12){
for(var i = 0; i <userId.length; i++){
if(userId.charAt(i)>=0 && userId.charAt(i)<10) ||
userId.charAt(i)>='a' && userId.charAt(i)<='z' ||
userId.charAt(i)>='A' && userId.charAt(i)<='Z')
}
}else{
return false;
}
입력받은 아이디의 각각 문자 하나하나 조건에 부합하는지 확인해야하기 때문에 입력받은 아이디의 length만큼 반복해야함.
또 각각의 문자 하나하나 숫자인지 또는 영문소문자인지, 대문자인지 비교해야 되기 때문에 굉장히 복잡함.
정규표현식 규칙
- 정규표현식 틀 = / /
- 시작부터 끝 = ^ $
- []내의 문자중 하나라도 존재할경우 = []
- a-z = 소문자 a부터 z까지
- A-Z = 대문자 A부터 Z까지
- 0-9 = 숫자 0부터 9까지
- 5글자 이상 12글자 이하 = {5,12}