갬쿠
개미 개발
갬쿠
전체 방문자
오늘
어제
  • ALL (137)
    • React (20)
    • JS & CSS & HTML (29)
    • Algorithm (62)
    • 웹 보안 (11)
    • 달리는 까까: 쿠키런 팬게임 (10)
    • Python (0)
    • 기타 (5)
    • 비공개 플젝 (0)

블로그 메뉴

  • GitHub
  • 방명록
  • 관리자 메뉴

공지사항

인기 글

태그

  • 달리는 까까
  • useState
  • useReducer
  • SQL Injection
  • 쿠키런 모작
  • 쿠키런
  • HTML
  • 모의 해킹
  • js
  • Programmers
  • 게임
  • Baekjoon
  • 크롬 공룡게임
  • REACT
  • 쿠키런 팬게임
  • Object
  • 리액트
  • transform
  • 게임 개발
  • Best of the Best
  • useEffect
  • 객체
  • CSS
  • BEAKJOON
  • node.js
  • Python
  • JavaScript
  • EventListener
  • 크롬 공룡 게임
  • 백준

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
갬쿠

개미 개발

JS e.target vs e.currentTarget (미스터리 해결기...)
JS & CSS & HTML

JS e.target vs e.currentTarget (미스터리 해결기...)

2023. 7. 20. 16:16

카드 목록에서 카드를 클릭했을 때 해당 카드의 id를 넘겨주어 위치를 변경하는 코드를 짜던 중 ㄹㅇ 의문스러운 일이 일어났다.

이 목록에서 각 presentation의 id는 1, 2, 3이다. 클릭했을 때 `/presentation/summary?presentation_id=${currentId}`로 위치를 변경했디.

const navigateToPresentation = (e) => {
    const currentId = e.target.id;
    navigate(`/presentation/summary?presentation_id=${currentId}`);
  };
{presentationList.map((p) => (
          <s.Presentation id={p.id} key={p.id} onClick={navigateToPresentation}>
            <s.PresentationTitle>{p.title}</s.PresentationTitle>
            <s.PresentationDate>{p.date}</s.PresentationDate>
          </s.Presentation>
        ))}

위 코드로 카드를 클릭했을 때 navigateToPresentation()을 호출하며 이벤트를 넘겨줬는데, 이벤트 타겟의 id값이 어떨 땐 넘어가고 어떨 땐 넘어가지 않는 것이다. 그런데 정말 어떤 기준으로 변화가 생기는 지 알 수가 없어서 (p.id 를 바로 넘겨주면 잘 작동 했지만) 한참을 들여다 봤다.

 

콘솔에 찍어가며 계속 시도해 본 결과,

  1. id가 넘어가지 않을 때 e.target은 id가 없는 엘리먼트였다.
  2. 하지만 화면에 있는 카드들에는 항상 id가 잘 들어가 있었다. (애초에 데이터가 안 들어갔다면 Presentation 카드가 제대로 나올 수가 없음)
  3. 그럼 클릭 이벤트의 target이 다른 엘리먼트로 인식 된 건 아닐까?

라는 흐름으로 파악이 됐다.

 

그래서 콘솔에 e.target을 찍어 나온 div의 class명을 화면에 찍힌 엘리먼트들의 class명과 비교해보니 원인을 알 수 있었다. 자식 엘리먼트인 제목이나 날짜가 클릭됐을 경우 부모 엘리먼트인 카드가 아니라 자식 엘리먼트가 이벤트의 타겟이 된 것이다. 자식 엘리먼트들에는 id가 없으니 당연히 어떤 값도 전달되지 않는다!

 

e.target이 문제였다. e.target은 부모로부터 이벤트가 위임되어 발생하는 자식의 위치, 즉 내가 클릭한 자식 요소를 반환한다. 그러나 e.currentTarget은 이벤트가 부착된 부모의 위치를 반환한다. onClick을 정의해준 Presentation 엘리먼트를 제대로 인식시켜 주려면 e.currentTarget을 사용해야 했던 것이다.

 

실제로

  const navigateToPresentation = (e) => {
    const currentId = e.currentTarget.id;
    navigate(`/presentation/summary?presentation_id=${currentId}`);
    console.log(e.target);
    console.log(e.currentTarget.id);
  };

위 코드로 e.target과 e.currentTarget의 id를 비교해 보니

이렇게 부모(id가 잘 들어가 있는 div)를 클릭했을 때나 자식(id가 없는 div)을 클릭했을 때나 부모의 id가 잘 출력되는 것을 확인할 수 있었다.

728x90

'JS & CSS & HTML' 카테고리의 다른 글

contentEditable로 수정 기능 구현하기  (0) 2023.07.17
JS sort (문자열 배열 정렬 & 숫자 배열 정렬)  (0) 2022.06.26
JS Image preloading  (0) 2022.05.31
CSS transform: translate vs. absolute positioning  (0) 2022.05.31
CSS line-height  (0) 2022.05.03
    'JS & CSS & HTML' 카테고리의 다른 글
    • contentEditable로 수정 기능 구현하기
    • JS sort (문자열 배열 정렬 & 숫자 배열 정렬)
    • JS Image preloading
    • CSS transform: translate vs. absolute positioning
    갬쿠
    갬쿠
    보안&소프트웨어 전공 프론트엔드 개발자

    티스토리툴바