Good Website?
좋은 웹사이트인지 아닌지 어떻게 구별할까? 오류가 없고, 이동이 자연스럽고 부드러워야 하며, 클릭하였을 때 빠르게 반응하여 사용자의 인내심을 테스트하지 않는 사이트가 좋은 사이트다. 요즘에는 화려하고 다양한 기능이 포함되는 웹사이트가 늘어나면서 프론트엔드 개발자가 처리해야할 interaction
이 더 많아졌다.
interaction
은 무엇을 의미하는 걸까? 쉽게 예를 들어 옷 쇼핑몰에서 제품 사진 위에 마우스를 올렸을 때(mouse over) 다른 각도의 제품 사진을 보여주는 것을 말한다.
Event
interaction
은 HTML
이나 CSS
만으로 구현하기는 어렵고 JavaScript
가 필요하다. 이렇게 특정 요소에 interactive
한 반응을 할 수 있게 하는 것을 Event
라고 한다.
등 다양하게 있다.
JavaScript
에서 Event
를 감지하고 그에 맞는 결과가 나올 수 있도록 코드를 작성해야한다.
addEventListener
Event
를 달 때 사용하는 함수명은 addEventListener
이다. 단어 그대로 해석을 하자면 Event
를 듣고 있다는 뜻이다. addEventListener
는 특정 Event
가 언제 발생하는지 가만히 듣고 있다가, 발생하면 인자로 받은 함수를 실행한다.
아래와 같은 형태다. 자세한 예제는 다음에 나와있으니 어떻게 생겼는지 형태만 보자.
요소.addEventListener(Event 종류, function() {
// Event가 일어났을 때 실행할 내용
});
특정 요소에 addEventListener
함수를 호출하고, 인자로 Event
종류와 Event
가 발생하였을 때 실행할 함수를 전달한다. 이렇게 전달된 함수를 Callback Function
이라고 한다.
Event 종류
Event
종류는 정말 많지만, 실제로 사용되는 Event
는 그렇게 많지 않다.
MDN : eventListener
w3schools : addEventListener
Click Event
버튼, 사진, 글 등 웹사이트에서 이루어지는 Event
중 가장 많은 비중을 차지하는 것이 Click Event
이다. 프론트엔드 개발자는 각 요소에 알맞는 Click Event
를 달고 reaction
을 만든다.
Click
-> 로그인 api 호출Click
-> 상품 상세 화면으로 이동ex)
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 thisIsButton = document.getElementsByClassName('login-btn')[0];
getElementsByClassName
함수로 login-btn
클래그 이름이 있는 요소를 찾는다. 마지막 [0]
은 왜 붙었을까? class
명은 여러 요소에 중복해서 이름을 줄 수 있다. 따라서 getElementsByClassName
으로 요소를 찾으면 여러 요소가 담긴 배열이 반환된다.
위에서 button
이라는 변수에 .login-btn
요소를 찾아서 저장하고 addEventListener
를 달아주었다. 첫번째 인자에 click
이라고 세팅하였다.
thisIsButton.addEventListener('click', function() {
// click 시 실행되어야 할 기능
});
앞으로 button.login-btn
을 click
하면, 두 번째 인자로 넘긴 함수가 실행된다.
Key Event
사람이 키보드를 누르면 발생하는 Event
이다.
keydown
keyup
keypress
keydown
으로 addEventListener
를 추가한 예시이다.
ex)
const thisIsPw = document.getElementById('password');
const thisIsCode = document.getElementById('code');
thisIsPw.addEventListener('keydown', function(event) {
thisIsCode.innerHTML = event.code;
});
아까 getElementsByClassName
으로 요소를 찾으면 배열이 return
되어서 [0]
으로 접근해야 했는데, 이번에는 getElementById
로 바로 사용할 수 있다.
const thisIsPw = document.getElementById('password');
id
는 중복 될 수 없으니 전체 페이지에서 요소가 한 개밖에 없어서 배열로 return
되지 않고 요소가 return
된 것이다.
input#password
요소에 keydown
이라는 Event
가 발생하면 걸릴 수 있도록 addEventListener
를 추가하였다.
thisIsPw.addEventListener('keydown', function(e) {
thisIsCode.innerHTML = e.code;
});
input
에 키보드로 뭔가를 누르면 두 번째 인자인 function
이 실행된다. 그래서 키보드르 누르면 span#code
의 내용에 e.code
가 들어가게 된다.
웹서핑을 하다 로그인 창을 마주하였을 때, 어떤 사이트는 Enter
를 치면 로그인 버튼이 눌려서 로그인이 되고, 어떤 사이트는 Enter
를 쳐도 로그인 버튼이 눌리지 않아 불편했던 경혐이 있을 것이다. 프론트엔드 개발자가 key event
를 추가하고 Enter
를 감지하여 로그인이 되도록 프로그래밍을 했느냐 안했느냐에 차이이다.
Enter
키의 code
는 'Enter
'이다. 아래와 같이 코드를 짤 수 있다.
thisIsPw.addEventListener('keydown', function(e) {
if (e.code === 'Enter') {
// 로그인 function으로 이동
}
});
input#re-password
에 keyup
이벤트를 추가한다.input#password
와 input#re-password
의 value
속성을 통해 input
에 작성된 값을 가져온다.<p>
태그의 .alert
클래스에 '비밀번호가 일치하지 않습니다'
라는 문구를 넣는다.''
빈 문구를 넣는다.const thisIsPw = document.getElementById('password');
const thisIsButton = document.getElementsByClassName('login-btn');
const thisIsRePassword = document.getElementById('re-password');
const thisIsAlert = document.getElementsByClassName('alert')[0];
thisIsRePassword.addEventListener('keyup', function() {
const rePassword = document.getElementById('re-password').value;
const password = document.getElementById('password').value;
if (rePassword === password) {
thisIsAlert.innerHTML = '';
} else {
thisIsAlert.innerHTML = '비밀번호가 일치하지 않습니다.';
}
});