7주차: JavaScript 이벤트

사용자의 상호작용에 반응하는 동적 웹페이지를 만들기 위한 이벤트 처리를 학습합니다

학습 목표

👆

이벤트 리스너

click, input 등 다양한 이벤트를 처리하는 방법을 배웁니다

🌳

DOM 조작

getElementById를 사용해 HTML 요소를 조작합니다

🔄

동적 컨텐츠

사용자 상호작용에 따라 페이지 내용을 변경합니다

📝

폼 처리

사용자 입력을 받고 처리하는 방법을 익힙니다

강의 내용

1. DOM과 이벤트 기초

DOM(Document Object Model)과 이벤트 처리의 기본 개념을 학습합니다.

DOM 요소 선택하기

// ID로 요소 선택
const title = document.getElementById('title');
const button = document.getElementById('myButton');

// 클래스로 요소 선택
const items = document.getElementsByClassName('item');
const cards = document.querySelectorAll('.card');

// 태그로 요소 선택
const paragraphs = document.getElementsByTagName('p');
const allDivs = document.querySelectorAll('div');

// CSS 선택자로 요소 선택
const firstItem = document.querySelector('.item'); // 첫 번째만
const navLinks = document.querySelectorAll('nav a'); // 모든 nav a 요소

이벤트 리스너 추가하기

// 클릭 이벤트
button.addEventListener('click', function() {
    alert('버튼이 클릭되었습니다!');
});

// 화살표 함수 사용
button.addEventListener('click', () => {
    console.log('버튼 클릭됨');
});

// 여러 이벤트 처리
const input = document.getElementById('textInput');

input.addEventListener('focus', () => {
    console.log('입력창에 포커스됨');
});

input.addEventListener('blur', () => {
    console.log('입력창에서 포커스 해제됨');
});

input.addEventListener('input', (event) => {
    console.log('입력된 내용:', event.target.value);
});

2. 주요 이벤트 타입

웹 개발에서 자주 사용되는 이벤트들을 알아봅시다.

// 마우스 이벤트
element.addEventListener('click', handleClick);        // 클릭
element.addEventListener('dblclick', handleDoubleClick); // 더블클릭
element.addEventListener('mouseenter', handleMouseEnter); // 마우스 진입
element.addEventListener('mouseleave', handleMouseLeave); // 마우스 떠남
element.addEventListener('mouseover', handleMouseOver);  // 마우스 오버

// 키보드 이벤트
document.addEventListener('keydown', (e) => {
    console.log('키 눌림:', e.key);
    if (e.key === 'Enter') {
        console.log('엔터 키 눌림');
    }
});

document.addEventListener('keyup', (e) => {
    console.log('키 떼어짐:', e.key);
});

// 폼 이벤트
const form = document.getElementById('myForm');
form.addEventListener('submit', (e) => {
    e.preventDefault(); // 기본 제출 동작 방지
    console.log('폼 제출됨');
});

// 윈도우 이벤트
window.addEventListener('load', () => {
    console.log('페이지 완전 로드됨');
});

window.addEventListener('resize', () => {
    console.log('윈도우 크기 변경됨');
});

3. DOM 조작하기

JavaScript로 HTML 요소의 내용과 스타일을 동적으로 변경하는 방법을 학습합니다.

요소 내용 변경

const title = document.getElementById('title');

// 텍스트 내용 변경
title.textContent = '새로운 제목';

// HTML 내용 변경
title.innerHTML = '<strong>굵은 제목</strong>';

// 속성 변경
const image = document.getElementById('myImage');
image.src = 'new-image.jpg';
image.alt = '새로운 이미지';

// 클래스 조작
const box = document.getElementById('box');
box.classList.add('highlight');      // 클래스 추가
box.classList.remove('old-style');   // 클래스 제거
box.classList.toggle('active');      // 클래스 토글
box.classList.contains('highlight'); // 클래스 존재 확인

스타일 변경

const element = document.getElementById('myElement');

// 직접 스타일 변경
element.style.color = 'red';
element.style.backgroundColor = 'yellow';
element.style.fontSize = '20px';
element.style.display = 'none';

// 스타일 객체로 여러 속성 변경
Object.assign(element.style, {
    color: 'blue',
    fontSize: '18px',
    padding: '10px',
    border: '2px solid black'
});

4. 실용적인 이벤트 예제

실제 웹 개발에서 자주 사용되는 이벤트 처리 패턴들을 살펴봅시다.

버튼 클릭으로 내용 변경

<!-- HTML -->
<button id="changeButton">내용 변경</button>
<p id="content">원래 내용</p>
// JavaScript
const button = document.getElementById('changeButton');
const content = document.getElementById('content');

let isChanged = false;

button.addEventListener('click', () => {
    if (!isChanged) {
        content.textContent = '변경된 내용!';
        button.textContent = '원래대로';
        isChanged = true;
    } else {
        content.textContent = '원래 내용';
        button.textContent = '내용 변경';
        isChanged = false;
    }
});

입력값에 따른 실시간 반응

<!-- HTML -->
<input type="text" id="nameInput" placeholder="이름을 입력하세요">
<p id="greeting">안녕하세요!</p>
// JavaScript
const nameInput = document.getElementById('nameInput');
const greeting = document.getElementById('greeting');

nameInput.addEventListener('input', (e) => {
    const name = e.target.value;
    if (name.trim() === '') {
        greeting.textContent = '안녕하세요!';
    } else {
        greeting.textContent = `안녕하세요, ${name}님!`;
    }
});

이미지 갤러리 만들기

<!-- HTML -->
<div class="thumbnails">
    <img src="thumb1.jpg" data-full="full1.jpg" class="thumb">
    <img src="thumb2.jpg" data-full="full2.jpg" class="thumb">
    <img src="thumb3.jpg" data-full="full3.jpg" class="thumb">
</div>
<img id="mainImage" src="full1.jpg">
// JavaScript
const thumbnails = document.querySelectorAll('.thumb');
const mainImage = document.getElementById('mainImage');

thumbnails.forEach(thumb => {
    thumb.addEventListener('click', (e) => {
        const fullImageSrc = e.target.dataset.full;
        mainImage.src = fullImageSrc;
        
        // 활성 썸네일 표시
        thumbnails.forEach(t => t.classList.remove('active'));
        e.target.classList.add('active');
    });
});

실습 활동

실습 1: 인터랙티브 카운터 만들기

목표: 버튼 클릭으로 숫자를 증가/감소시키는 카운터를 만듭니다.

요구사항:

  • + 버튼: 카운터 증가
  • - 버튼: 카운터 감소
  • 리셋 버튼: 카운터 0으로 초기화
  • 카운터 값에 따른 색상 변경 (음수: 빨강, 양수: 파랑)
GitHub Copilot

실습 2: 다크 모드 토글 구현

목표: Copilot과 함께 다크/라이트 모드를 전환하는 기능을 구현합니다.

구현 사항:

  • 토글 버튼으로 테마 전환
  • CSS 클래스를 활용한 스타일 변경
  • 현재 테마 상태를 로컬 스토리지에 저장
  • 페이지 로드 시 저장된 테마 적용

실습 3: 간단한 할 일 목록

목표: 사용자가 할 일을 추가하고 관리할 수 있는 목록을 만듭니다.

기능:

  • 새 할 일 추가
  • 할 일 완료 체크
  • 할 일 삭제
  • 완료된 할 일 스타일 변경
  • 전체 할 일 개수 표시

주차 요약

핵심 포인트

  • addEventListener로 이벤트 처리
  • DOM 요소 선택 및 조작
  • 동적 콘텐츠 변경
  • 사용자 입력 처리
  • 실용적인 인터랙션 패턴

다음 주 미리보기

8주차는 중간고사입니다. 프로젝트 제안서 작성과 HTML/CSS 프로토타입을 제작하여 최종 프로젝트를 준비합니다.