이벤트 다루기
addEventListener 로 클릭과 입력에 반응합니다.
사용자가 무언가 할 때 실행합니다
여기까지의 코드는 실행하면 위에서 아래로 한 번 돌고 끝났습니다. 이제 사용자가 누르거나 입력할 때 실행되는 코드를 붙입니다.
addEventListener 에 무슨 일과
할 일을 넘깁니다. 할 일은 함수입니다 — 2.6 의 콜백입니다.
요소.addEventListener("click", () => {
할 일
});
누르면 화면이 바뀝니다
아래 예제는 마지막 줄에서 코드로 한 번 눌러 결과를 바로 보여 줍니다. 실행한 뒤 미리보기 탭에서 직접 눌러 보세요. 누를 때마다 숫자가 올라갑니다.
const btn = document.querySelector("#btn"); const msg = document.querySelector("#msg"); let count = 0; btn.addEventListener("click", () => { count++; msg.textContent = `${count}번 눌렀습니다`; }); btn.click(); console.log(msg.textContent);
count 가 함수 밖에 있는데 안에서 계속 늘어납니다.
2.5 에서 본 클로저입니다.
출력 칸은 실행할 때 한 번만 채워집니다. 미리보기에서 눌러 본 결과는 출력 칸이 아니라 화면에 나타납니다.
이벤트 객체
넘긴 함수는 무슨 일이 있었는지 담은 객체를 하나 받습니다. 어디를 눌렀는지, 무엇을 입력했는지가 여기 들어 있습니다.
const btn = document.querySelector("#btn"); btn.addEventListener("click", event => { console.log(event.type); console.log(event.target.tagName); console.log(event.target.dataset.name); }); btn.click();
event.target 은 실제로 그 일이 일어난 요소
입니다. 4.7 의 위임에서 이것을 그대로 사용합니다.
입력에 반응하기
const input = document.querySelector("#name"); const echo = document.querySelector("#echo"); input.addEventListener("input", event => { echo.textContent = event.target.value; }); input.value = "홍길동"; input.dispatchEvent(new Event("input")); console.log(echo.textContent);
input 은 글자가 바뀔 때마다 일어납니다. 마지막 두 줄은
사람이 입력한 것처럼 코드로 흉내 낸 것입니다. 미리보기에서 직접 입력해
보세요.
기본 동작 막기
링크를 누르면 이동하고, 폼을 보내면 화면이 새로 뜹니다. 그것을 막고 내가 정한
일만 하게 하려면 preventDefault 를 부릅니다.
const link = document.querySelector("#link"); const log = document.querySelector("#log"); link.addEventListener("click", event => { event.preventDefault(); log.textContent = "이동을 막았습니다"; }); link.click(); console.log(log.textContent);
자주 사용하는 이벤트
click— 눌렀을 때input— 입력 칸의 글자가 바뀔 때마다change— 다 입력하고 칸을 벗어났을 때submit— 폼을 보낼 때 (4.7)keydown— 자판을 눌렀을 때
처음에 자주 걸리는 것
2.6 에서 본 것과 같습니다. 괄호를 붙이면 그 자리에서 실행되고, 돌려준 값이 넘어갑니다. 넘길 때는 괄호 없이 이름만 적습니다.
btn.addEventListener("click", handleClick()); // 지금 실행됩니다
btn.addEventListener("click", handleClick); // 이렇게 적습니다
"onclick" 이 아니라
"click" 입니다. 오류가 나지 않고 그냥 아무 일도
일어나지 않습니다.
querySelector 가
null 을 돌려줬는데 이어서 붙이면 오류가
납니다(4.2).
TypeError: Cannot read properties of null (reading 'addEventListener')
직접 해보기
단추를 누를 때마다 #msg 에
active class 를 붙였다 뗐다 하세요(4.4).
입력 칸에 글자를 넣을 때마다 5 / 20 형태로 글자
수를 보여 주세요. 20자를 넘으면 over class 를
붙입니다.
이 단원의 정리
addEventListener에 이벤트 이름과 할 일을 넘깁니다.- 넘길 함수에는 괄호를 붙이지 않습니다.
- 이벤트 이름에
on을 붙이지 않습니다. - 넘긴 함수는 이벤트 객체를 받습니다.
event.target이 그 일이 일어난 요소입니다. preventDefault로 기본 동작을 막습니다.