본문 바로가기
CodeIt_Sprint/인터렉티브_자바스크립트

(7)인터렉티브_자바스크립트_태그에 이벤트 핸들러 등록,제거하기, 이벤트객체 => 동작에 대하여, 어떤 event동작, 태그항목이 관련되어있는지의 정보 객체

by 코잼민 2024. 11. 29.

● 개념1 : 태그에 이벤트 핸들러 등록,제거하기 => addEventListener(),removeEventListener()

○ 문법 :

    • 요소노드.addEventListener( 동작에 해당되는 event , 함수이름 || 직접 함수 작성 {...});
    • Ex_
const btn = document.getElementbyTagName('button');

function btnClickPrint(){
	console.log('버튼 누르면 출력됨');
}


 //'click' 왼쪽 마우스 클릭 동작에 대한 event 명칭이다.
btn.addEventListener('click',btnClickPrint);

 

○ 핸들러 등록 방법 2가지

방법1_ 이벤트 핸들러를 제거할 필요가 없다면, => 매개인자 2번째 함수자리에 직접 함수 작성으로 등록하는 방법 (이유 : 저딴식으로 등록하면, 해제가 안됨)

const btn = document.getElementbyTagName('button');

//'click'  왼쪽 마우스 클릭 동작에 대한 event 명칭이다.
btn.addEventListener('click',function(){
	console.log('버튼 누르면 출력됨');

});

방법2_ 이벤트 핸들러를 제거할 필요 => 함수를 따로 선언한 후, 매개인자 2번째 자리에 함수명 대입

const btn = document.getElementbyTagName('button');

function btnClickPrint(){
	console.log('버튼 누르면 출려됨');
}


//'click'  왼쪽 마우스 클릭 동작에 대한 event 명칭이다.
btn.addEventListener('click',btnClickPrint);

//핸들러 등록 해제=>removeEventListener()
btn.removeEventListener('click',btnClickPrint);

 연습문제 :

다음 HTML 코드를 보고 아래의 문제를 해결해 주세요.

<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="UTF-8">
  <title>오늘 할 일</title>
</head>
<body>
  <button id="btn">Click!</button>
  <script src="index.js"></script>
</body>
</html>

문제1 :

아래와 같이 코드를 작성한 다음 프로그램을 실행했습니다. 다음 중 웹 페이지에 나타나는 버튼을 클릭 했을 때 콘솔에 출력되는 결과로 올바른 보기를 선택해 주세요.

const btn = document.querySelector('#btn');

function printBtn() {
  console.log(btn.outerHTML);
}
  
btn.onclick = function() {
  console.log('click!');
};
btn.onclick = printBtn;
btn.removeEventListener('click', printBtn);

해설 :

  • 태그의 oinclick속성으로 함수 대입으로 등록한 핸들러는 딱 1개씩밖에 등록 안됨 => 따라서, 최종 등록 메소드는 printBtn() 밖에 안됨
  • 마지막에 removeEventListener는 addEventListener로 등록된 함수들만 제거대상 => 따라서 등록된것이 아무것도 없으므로, 제거된것도 없다.

답 :

<button id="btn">Click!</button>

 

문제2 :

아래와 같이 코드를 작성한 다음 프로그램을 실행했습니다. 다음 중 웹 페이지에 나타나는 버튼을 클릭 했을 때 콘솔에 출력되는 결과로 올바른 보기를 선택해 주세요.

const btn = document.querySelector('#btn');

function printBtn() {
  console.log(btn.outerHTML);
}
  
function printHi() {
  console.log('Hi!');
}
 
btn.addEventListener('click', printBtn);
btn.removeEventListener('click', printHi);
btn.addEventListener('click', printHi);
btn.addEventListener('click', function() {
  console.log('click!');
});
btn.removeEventListener('click', function() {
  console.log('click!');
});

해설 :

=> 최종 등록된 핸들러

  • onclick 에 등록된 핸들러 : X
  • addEventListener로 등록된 핸들러 : printBtn, printHi , "click"출력 메소드

 

답 :

<button id="btn">Click!</button>
Hi!
click!

 

● 개념2 : 이벤트 객체 => 어떠한 동작과 어떤 태그가 관련되어있는지 등의 정보를 담고있는 객체

<!DOCTYPE html>
<html lang="ko">

<head>
  <meta charset="UTF-8">
  <title>JS with Codeit</title>
</head>

<body>
  <div id="content" class="btns">
    <input type="text" id="myInput" placeholder="type anything">
    <button id="myBtn">click me!</button>
  </div>
  <script>
    //여기에 작성하기
  </script>
</body>

</html>

 

○ 예시 : input 태그에서 클릭됐을 시, || 키보드 입력시 의 이벤트 type이 출력되도록, JavaScript 코드작성 하기

//input에 해당되는 태그
const input = document.querySelector('#myInput');
//'keydown' : 해당 태그에 키보드 입력 동작이 있을 시
    input.addEventListener('keydown',function(event){
      console.log(event)
      //event 객체 출력
    });

- console창 출력장면 :

=> 더 자세히 보면, event객체의 프로퍼티를 알 수 있는데, 여기서

  • event.type : 해당 동작에 대한 event값이 저장됨

//예: 'click', 'keydown' : 마우스 왼쪽 클릭, 키보드 입력

  • event.target : 해당 동작에 대해 이벤트가 발생한 요소(태그)
  • event.currentTarget : 이벤트핸들러가 등록된 요소(태그)

//위의 예시에는 input가 출력된다.

 연습문제 :

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

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

- index.html

<!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></script>
</body>
</html>

- style.css

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;
}

답 :

★내가 자주 틀리는 부분

=> lists 들을 유사배열 형태로 변수에 저장할 떄,

const lists = document.querySelectorAll('.to-do-list'); (X)

const lists = document.querySelectorAll('.to-do-list li') (O) //정확히 태그이름들을 지정하자!!

    const lists = document.querySelectorAll('.to-do-list li');

    function addDone(event) {
      event.target.classList.toggle('done');
    }

    for (let li of lists) {
        li.addEventListener('click', addDone);
    }

    lists[2].removeEventListener('click',addDone);