본문 바로가기
CodeIt_Sprint/JavaScript_중급

(5)JavaScript중급_3_2_이벤트객체

by 코잼민 2024. 11. 13.

⊙ 이벤트 객체 :

#알아야 할 개념 :

● 개념1 : 이벤트 객체의 정의

○ 정의 : onclick 프로퍼티 || addEventListener() 프로퍼티 메소드로 이벤트 핸들러 등록시, 동작과 해당 태그의 상호 연결이 가능하도록 하는 역할을 해주는 객체이다.

- Ex

const btn = document.querySelector('BUTTON'); //버튼 태그의 요소노드 변수 저장

function printBtn(event)
{
	event.target.style.backgroundColor = "yellow";
}

btn.addEventListener('click',printBtn);
//버튼을 마우스 왼쪽 클릭으로 누를 시, 버튼의 배경색을 yellow로 변한다.

● 개념2 : 이벤트 객체의 주 프로퍼티 (2가지)

event.target : 요소노드의 해당 태그를 의미한다.

 event.type : 어떤 동작의 대한 이벤트 유형을 를 의미한다. //'click', 'keydown' , 'contextmenu'...

◎ 연습문제 :

const toDoList = document.querySelector('#to-do-list');
const items = toDoList.children;

items[0].addEventListener('click', function() {
  items[0].classList.toggle('done');
});

items[1].addEventListener('click', function() {
  items[1].classList.toggle('done');
});

items[2].addEventListener('click', function() {
  items[2].classList.toggle('done');
});

코드를 실행해 보니 클릭했을 때 스타일도 변하고 나름대로 잘 작성한 것 같지만, 반복되는 부분들이 너무 많아 만약 할 일들이 점점 더 늘어난다면 이런 비슷한 코드를 훨씬 더 많이 작성해야 할 것 같습니다.

그리고 방금 지용이가 작성한 코드처럼 addEventListner를 호출할 때 바로 작성한 이벤트 핸들러는 removeEventListener로 제거할 수도 없는데요. 지용이는 이를 어떻게 해결해야 할지 막막합니다.

지용이를 위해 아래 내용들을 완성해 주세요.

  1. 1. 이벤트 객체를 활용한 이벤트 핸들러, updateToDo 함수를 작성한다. 이 함수는 이벤트가 발생한 대상에 'done'이라는 class 속성값을 toggle하는 함수여야 합니다.
  2. 2.  반복되는 부분들이 좀 더 간단하게 정리되도록 이벤트 핸들러를 등록하는 반복문을 작성해 주세요.

코드를 잘 작성했다면, 첫 번째 두 번째 할 일은 클릭했을 때 'done'이라는 class 속성값이 toggle되면서 스타일이 변하고, 세 번째 할 일은 클릭을 해도 아무런 변화가 없어야 합니다.

디폴트 출력장면

<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <title>오늘 할 일</title>
  <link rel="stylesheet" href="style.css">
</head>
<body>
  <div class="main">
    <h2 class="title">오늘 할 일</h2>
    <ul id="to-do-list" class="to-do-list">
      <li>자바스크립트 공부하기</li>
      <li>고양이 화장실 청소하기</li>
      <li>고양이 장난감 쇼핑하기</li>
    </ul>
  </div>
  <script src="index.js"></script>
</body>
</html>
body {
  margin: 0;
  padding: 0;
	display: flex;
	align-items: center;
	justify-content: center;
}

.main {
	width: 350px;
	margin: 40px;
  padding: 30px 0;
  background-color: #FCFCFC;
  box-shadow: -5px -5px 20px #DFDFDF,  5px 5px 20px #BABECC;
  border-radius: 8px;
  text-align: center;
}

.title {
	margin: 15px auto;
	font-size: 30px;
	font-weight: 600;
	color: #9600FF;
}

#to-do-list {
  width: 280px;
	margin: 0 auto 15px;
	padding: 0;
	list-style: none;
}

#to-do-list li {
	display: flex;
	align-items: center;
	justify-content: center;
  width: 90%;
  height: 40px;
	margin: 8px auto 15px;
	border-bottom: 1px solid #9600FF;
	cursor: pointer;
}

.done {
  opacity: 0.5;
  text-decoration: line-through;
}

  해설 :

- 전략 :

<li>태그들을 for문을 이용해 classList.add('done') || toggle('done') 로 class를 추가하여, 버튼을 누를시, done css 스타일 시트가 적용되도록 해야한다.

- 과정 : //순서 암기하자! 자주 쓰임

①. 버튼을 누를 시 , 해당 태그가 어떤 변화동작이 되어야 하는지의 메소드를 먼저 선언 //function updateToDo() 작성

②. <li> 태그들 이벤트 등록 // for + addEventListener

③. removeEventListener// 특정 리스트는 적용안되도록 하는 방법임

- 정답 :

const toDoList = document.querySelector('#to-do-list');
const items = toDoList.children;

// 1. updateToDo 함수를 완성해 주세요
//버튼 누르면 적동되야할 내용 구현
function updateToDo(event) {
  event.target.classList.add('done');
}

// 2. 반복문을 활용해서 각 li태그에 이벤트 핸들러를 등록해 주세요
for(let i =0;i<items.length;i++)
{
  items[i].addEventListener('click',updateToDo);
}


// 테스트 코드
items[2].removeEventListener('click', updateToDo);