1 분 소요

🔮 이벤트 기본 조작

const ilbuni = document.querySelector(".ilbuni.c");
ilbuni.addEventListener("click", function () {
  ilbuni.classList.toggle("special");
});

조작하고자 하는 DOM을 가져와서 addEventListener(type, function, options) 를 해준다.

See the Pen 05_01 by sohnsookyoung (@sohnsookyoung) on CodePen.


근데 여기서 script 태그를 head 태그 안에 넣어주기 위해서는 페이지 로드가 끝나고 script 태그가 로드되어야 하므로 load 클래스를 사용한다.

window.addEventListener("load", function () {
  const ilbuni = document.querySelector(".ilbuni.c");
  ilbuni.addEventListener("click", function () {
    ilbuni.classList.toggle("special");
  });
});

근데 이렇게 하면 모든 페이지가 로드된 이후에 작동이 되므로 비효율적이다.

📍 효율적으로 head 태그 안에 script 태그 넣기

window.addEventListener("DOMContentLoaded", function () {
  const ilbuni = document.querySelector(".ilbuni.c");
  ilbuni.addEventListener("click", function () {
    ilbuni.classList.toggle("special");
  });
});

DOMContentLoaded 를 사용해준다. DOMContentLoaded를 사용해주면 돔이 로드가 된다면 바로 이벤트 리스너를 사용할 수 있도록 해준다.

📍 RULE 1. body 태그에 script 태그 넣어주기

요즘은 이 방법을 더 많이 쓴다고 한다.

📍 RULE 2. 전역 변수를 최소화 하자

그래서 전역 변수를 최소화하기 위해서 작성해두었던 코드를 다시 함수로 감싸서 지역 변수로 만들어 준다. 이때 함수 이름이 붙으면 다시 그 함수는 전역 변수가 되므로 이름이 없는 함수를 만들어 준다.

(function () {
  const ilbuni = document.querySelector(".ilbuni.c");
  const clickInbuniHandler = () => {
    ilbuni.classList.toggle("special");
  };
  ilbuni.addEventListener("click", clickInbuniHandler);
})();

🔮 this와 이벤트 객체

(function () {
  const characters = document.querySelector(".characters");
  function clickHandler(e) {
    console.log(e.currentTarget);
    console.log(e.target);
  }
  characters.addEventListener("click", clickHandler);
})();

이벤트에 추가된 메소드의 경우 자동으로 e라는 매개변수가 추가된다.

  • e.currentTarget: this와 e.currentTarget은 이벤트가 등록되어있는 객체를 가리킨다.
  • e.target: e.target의 경우는 내가 클릭한 객체가 무엇인지를 알 수 있다.

🔮 움직이는 캐릭터 예제로 클릭 이벤트 익혀보기

See the Pen 05_03 by sohnsookyoung (@sohnsookyoung) on CodePen.

🔮 이벤트 위임

📍 반복문을 통해서 이벤트 리스너를 등록한 것은 비효율이다.

💡 sol: 부모 DOM에 이벤트 리스너를 등록하고 e.target을 사용해서 자식 노드에 이벤트를 적용시킨다.

❗ 문제점: 자식 노드 외의 다른 stage 공간이 클릭이 된다면 에러가 뜬다.

💡 sol: 조건문을 통해서 예외처리를 해준다. => classList.contains(‘클래스이름’)

최종.js

(function () {
  const stage = document.querySelector(".stage");
  function clickHandler(e) {
    if (e.target.classList.contains("ilbuni")) {
      stage.removeChild(e.target);
    }
  }
  stage.addEventListener("click", clickHandler);
})();

📍 이벤트 위임 받은 객체 안에 또 객체가 있는 경우

  • pointer-events: none;: 클릭 이벤트를 받지 않는다. => 간단한 구조에서는 상관 없지만 하위에 있는 요소에 대한 다른 클릭 이벤트가 필요하다면 아래와 같은 클릭 이벤트 메소드를 작성해줄 수 있다.
  • function clickBtnHandler(e) {
      let elem = e.target;
      while (!elem.classList.contains("menu-btn")) {
        elem = elem.parentNode;
        if (elem.nodeName === "BODY") {
          elem = null;
          return;
        }
      }
    }
    

댓글남기기