특정 요소에 interactive한 반응을 할 수 있게 하는 것을 이벤트라고 한다
interactive한 반응은 무엇일까?
예를 들어 쇼핑몰에서 사진 위에 마우스를 올렸을때(mouse over) 다른 각도의 제품 사진으로 바꿔서 보여주는 것이다
위의 기능은 html, css만으로 구현할 수 없고 자바스크립트 코딩이 필요하다
요새는 화려하고 다양한 기능이 들어가는 웹사이트가 늘어나면서 프론트엔드 개발자가 처리해야할 interaction이 더 많아졌다
종류로는
등 다양한 것이 있다
참고사이트
w3s event
MDN event
MDN event 참조
대략적인 종류를 살펴보도록 하자
이벤트를 달 때 사용하는 함수
특정 이벤트가 언제 발생하는지 가만히 듣고 있다가, 발생하면 인자로 받은 함수(콜백함수)를 실행
요소.addEventListener(이벤트종류, function() {
// 이벤트가 일어났을 때 실행할 내용
});
// ES6 arrow function 사용
요소.addEventListener(이벤트종류, () => {
// 이벤트가 일어났을 때 실행할 내용
});
특정 요소에 addEventListener 함수를 붙이고(호출하고),
인자로 이벤트 종류와, 이벤트가 발생했을 때 실행할 함수를 전달 (인자로 전달할 함수는 콜백함수!)
참고자료
w3s addEventListener
MDN addEventListener
자주쓰이는 이벤트 종류
버튼, 사진, 글 등 웹사이트에서 이루어지는 이벤트 중 가장 많은 것이 클릭이벤트이다
프론트엔드 개발자는 버튼, 사진, 글 등의 요소마다 클릭 이벤트를 달아서,
각자 클릭 이벤트에 맞는 reaction을 프로그래밍한다
예를 들어
할 수 있는 일이 정말 많다!!
event함수를 추가하고 싶으면 앞에서 배웠던 DOM을 사용한다
그래서 DOM에 어떻게 접근하고, 어떻게 수정하는지 잘 알고있어야한다
기초가 중요!
간단히 코드를 살펴보면
// getElementByClassName 함수로 login-btn 클래스 이름이 있는 요소 찾기
// [0]은 왜?? class이름은 여러 요소에 중복해서 이름을 줄 수 있다
// 그래서 getElementByClassName으로 요소를 찾으면 여러 요소가 담긴 배열이 반환
// 해당 클래스 이름을 가진 요소가 하나 밖에 없으면 요소가 하나인(배열 길이가 한 개인) 배열이 반환
// 각 인덱스에 맞는 값 가져오기,, 이래서 기초가 중요, 어떻게 값을 불러와야할지 알아야 되니까
const thisIsButton = document.getElementsByClassName('login-btn')[0];
// thisIsButton 변수에 .login-btn 요소를 찾아서 저장
// 요소에 addEventListener 달아주기
// 첫번째 인자에 'click'이라고 세팅
// 앞으로 button.login-btn을 클릭(click 이벤트가 발생)하면, 두번째 인자로 넘긴 함수가 실행
thisIsButton.addEventListener('click', function() {
// 함수 안에 변수 선언해야 클릭했을때 값을 가져옴
// password 변수에 id 이름 password의 값을 저장, id는 하나밖에 없으므로 배열이 리턴되지 않음 그냥 사용
const password = document.getElementById('password').value;
// rePassword 변수에 id 이름 re-password의 값을 저장
const rePassword = document.getElementById('re-password').value;
// password가 입력되지 않으면
if (!password) {
alert('비밀번호를 입력해주세요!');
return; // 리턴 없으면 alert('로그인 성공!!') 넘어감 함수가 종료되지 않기 때문에
}
// repassword가 입력되지 않으면
if(!rePassword) {
alert('비밀번호 확인을 입력해주세요!');
return;
}
// password가 repassword가 맞지 않으면
if(password !== rePassword) {
alert('비밀번호가 맞지 않습니다!');
return;
}
alert('로그인 성공!!');
});
키보드를 누르면 발생하는 이벤트이다
간단히 코드를 살펴보면
// thisisPw 변수에 id 이름 password 요소 찾아서 저장, Id name은 하나밖에 없으므로 그냥 사용
const thisIsPw = document.getElementById('password');
// thisIsCode 변수에 id 이름 code 요소 찾아서 저장
const thisIsCode = document.getElementById('code');
// keydown 이벤트로 addEventListener 추가 (키보드를 눌렀을 때 발생하는 event)
// input#password 요소에 keydown이라는 이벤트가 발생하면 걸릴 수 있도록 eventListener 추가
// keydown 실행하면 두번째 인자인 function 실행
// 키보드를 누르면 span#code의 내용에 해당 key code가 들어가있음
// key code란 각 키보드가 갖고 있는 고유한 code
// 평소 다른 웹사이트에서 로그인할 때 어디는 엔터, 어디는 엔터쳐도 로그인 되지 않으면
// 프론트엔드 개발자가 key 이벤트를 추가해서 엔터를 감지하여 로그인이 되도록 프로그래밍 했냐 안했냐 차이
// 두번째 인자인 함수에 항상 event와 관련된 정보를 인자로 받을 수 있다
thisIsPw.addEventListener('keydown', function(event) {
thisIsCode.innerHTML = event.keyCode;
});
위의 코드에 설명해놨지만
function(e) {...} 여기서 파라미터 e는 항상 event가 발생했을 때 정보를 인자로 전달 받는다
그래서 위의 코드에서 응용하자면
key code를 이용하여 엔터가 이벤트로 감지되면 특정 함수를 실행시킬 수 있다
// keydown이 일어날때 마다 발생하는 일을 function에 인자값으로 전달
thisIsPw.addEventListener('keydown', function(e) {
// 엔터의 keyCode 는 13
if (e.keyCode === 13) {
//로그인 함수로 이동
}
});
파라미터 e의 역할
console.log(e) 하면 keyup이 발생할때 마다 어떤 일이 일어나는지 알 수 있다
즉 이벤트가 발생할 때마다 발생값을 인자로 전달받는다
const thisIsButton = document.getElementsByClassName('login-btn')[0];
thisIsButton.addEventListener('click', function() {
const password = document.getElementById('password').value;
const rePassword = document.getElementById('re-password').value;
if (!password) {
alert('비밀번호를 입력해주세요!');
return;
}
if (!rePassword) {
alert('비밀번호 확인을 입력해주세요!');
return;
}
if (password !== rePassword) {
alert('비밀번호가 맞지 않습니다!');
return;
}
alert('로그인 성공!!');
});
const thisIsPw = document.getElementById('password');
const thisIsCode = document.getElementById('code');
thisIsPw.addEventListener('keydown', function(event) {
thisIsCode.innerHTML = event.keyCode;
});
const checkRePw = document.getElementById('re-password');
const checkPw = document.getElementById('password');
checkRePw.addEventListener('keyup', function(e) {
const addP = document.getElementsByClassName('alert')[0];
const cPw = document.getElementById('password').value;
const cRePw = document.getElementById('re-password').value;
console.log(e.key) // keyup 할 때마다 키 값 콘솔에 출력 이거와 비교하면 안됨
// 밖에다 해놓고 value로 불러와도 적용 가능
// 둘 다 가능 근데 코드블록안에있는 변수 쓰는것이 더 좋을라나? scope pollution 과 관련 있을라나...
// if(cPw !== cRePw)
// if(checkPw.value !== checkRePw.value)
if(cPw !== cRePw) {
addP.innerHTML = '비밀번호가 일치하지 않습니다'
} else {
addP.innerHTML = '';
}
})