이벤트


아무런 반응도 하지 않는 페이지는 그냥 문서일 뿐입니다. 사용자가 버튼을 클릭하거나, 검색창에 타이핑하거나, 폼을 제출했을 때 무언가가 일어나게 하고 싶은 순간, "이 일이 일어나면 이 코드를 실행하라"고 말할 방법이 필요합니다. 그것이 바로 이벤트입니다. 이 챕터에서는 사용자가 하는 행동을 감지하고 거기에 반응하는 방법을 다룹니다.
이벤트 감지하기
**이벤트(event)**란 클릭, 키 입력, 폼 전송처럼 페이지에서 일어나는 일을 말합니다. 이벤트에 반응하려면 엘리먼트를 선택하고, 관심 있는 이벤트의 이름을 지정한 다음, 그 일이 일어났을 때 실행할 함수를 넘겨주면 됩니다.
이 함수를 **핸들러(handler)**라고 부릅니다. 핸들러를 연결하는 메서드가 addEventListener입니다:
const button = document.querySelector(".buy-button");
button.addEventListener("click", () => {
console.log("Someone clicked buy");
});왼쪽부터 순서대로 읽어보면, 이 버튼에서 "click" 이벤트를 기다리다가, 그 일이 일어나면 이 함수를 실행하라는 뜻입니다. 핸들러는 이벤트가 일어날 때마다 실행되며, 한 번만 실행되는 게 아닙니다. 세 번 클릭하면 세 번 실행됩니다.
핸들러는 평범한 함수이고, 핸들러를 붙이는 엘리먼트는 DOM에서 가져옵니다. 엘리먼트를 선택하고 함수를 작성할 수 있다면, 사용자가 그 엘리먼트에 하는 행동에 반응할 수 있습니다.
"click"처럼 문자열로 이벤트 이름을 지정한 다음, 실행할 함수를 addEventListener에 넘기면 됩니다. 이 함수가 핸들러이며, 한 번만 실행되는 게 아니라 이벤트가 일어날 때마다 매번 실행됩니다. 페이지가 사용자에게 반응하는 거의 모든 동작이 이 메서드 하나에서 시작됩니다. 이벤트 객체
브라우저가 핸들러를 실행할 때, 무슨 일이 일어났는지를 설명하는 정보 하나를 함께 넘겨줍니다. 이것이 바로 **이벤트 객체(event object)**입니다. 보통 event라는 이름의 매개변수를 핸들러에 추가해서 이 값을 받습니다:
const button = document.querySelector(".buy-button");
button.addEventListener("click", (event) => {
console.log(event.target); // 클릭된 엘리먼트
});가장 유용한 부분은 event.target, 즉 이벤트가 일어난 엘리먼트입니다. 버튼을 클릭했다면 event.target은 바로 그 버튼입니다. 다시 선택할 필요 없이, 이벤트가 이미 어디에서 시작됐는지 알려줍니다.
event라는 이름의 매개변수를 지정하세요. 가장 자주 쓰게 될 부분은 이벤트가 일어난 엘리먼트인 event.target입니다. 다시 선택할 필요 없이, 이벤트가 이미 어디에서 시작됐는지 알고 있습니다. 자주 쓰는 이벤트
여러분이 만들 대부분의 기능은 몇 가지 이벤트만으로 충분히 처리됩니다:
click: 사용자가 무언가를 클릭하거나 탭할 때.input: 텍스트 필드의 값이 입력 중에 바뀔 때.submit: 폼이 전송될 때.keydown: 키가 눌릴 때.
까다로운 것은 submit입니다. 기본적으로 폼을 제출하면 페이지가 새로고침되어, 자바스크립트가 하던 작업이 모두 사라져 버립니다. 이를 막으려면 핸들러 안에서 event.preventDefault()를 호출하세요:
const form = document.querySelector("form");
form.addEventListener("submit", (event) => {
event.preventDefault(); // 페이지가 새로고침되는 것을 막습니다
console.log("Form submitted, page stays put");
});click, input, submit, keydown입니다. 꼭 기억할 것은 submit인데, 폼은 기본적으로 페이지를 새로고침하므로, 이를 막고 제어권을 유지하려면 핸들러에서 event.preventDefault()를 호출해야 합니다. 이를 빠뜨리면 페이지가 갑자기 새로고침되는데, 처음에는 당황스러울 수 있습니다. 이벤트, 그 다음은?
이벤트는 페이지가 무언가를 감지하는 방법입니다. 엘리먼트를 선택하고, 관심 있는 대상을 지정한 다음, 그 일이 일어나면 함수를 실행하면서 이벤트 객체에서 필요한 정보를 읽어옵니다. 거의 모든 인터랙티브 기능이 이 흐름 위에서 만들어집니다.
자연스러운 다음 단계는 폼을 서버로 전송하거나 새 데이터를 불러오는 것처럼, 페이지를 멈추지 않고도 핸들러 안에서 시간이 걸리는 작업을 처리하는 것입니다. 이것이 바로 비동기(async) 코드가 하는 일이며, 다음 챕터에서 다룹니다. 객체(objects)에 담아둔 항목 목록처럼 구조화된 데이터를 다루는 핸들러도 여러분이 이미 알고 있는 내용에 의존합니다.

