인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

이태경님의 프로필 이미지

작성한 질문수

[React / VanillaJS] UI 요소 직접 만들기 Part 1

scrollSpy 바닐라버전에서 data-index를 찾는 코드 질문

해결된 질문

작성

·

49

0

강사님 안녕하세요. 항상 강의 잘 보고 있습니다 🙂

완강하고 다시 보다가, scrollSpy 바닐라버전에서 궁금한 점이 있어서 질문 남깁니다!

 

네비게이션의 버튼을 클릭 했을때, 버튼의 부모인 li의 index 값을 찾기 위해 사용했던 e.composedPath() 대신 closest('li') 메서드 를 사용하는 것은 어떤지 궁금해서요!

퍼블리셔로 일하면서, 클릭한 타겟의 가까운 부모를 찾을때 자주 사용했던 메서드인데, e.composedPath()를 사용한 다른이유(강의에서 설명한 이유 외에)가 있으신지 궁금합니다!

 

답변 2

1

정재남님의 프로필 이미지
정재남
지식공유자

closest로 충분합니다!

다른 메서드도 소개하고 싶어서 억지로 끼워넣어 봤어요 ㅎㅎ

차이라면 e.composedPath는 발생한 이벤트에서 바로 메서드를 적용하는 것이고,
e.target.closest는 이벤트가 발생한 요소에서 찾는 것이죠.

closest는 내부에 지정한 선택자에 해당하는 상위 요소를 탐색하는 명령이니 매 번 새로 탐색을 할 수밖에 없죠.
반면 e.composedPath는 이벤트 객체에 처음부터 담겨 있는 '버블링할 대상들'을 배열로 반환해주는 메서드라서 노드를 다시 탐색하지 않을 것이라 추측합니다.

제 추측이 맞다면, e.composedPath가 성능상 아주 약간이나마 이점이 있을 것 같네요.

이태경님의 프로필 이미지
이태경
질문자

아하! 감사합니다! 덕분에 저런 메서드가 있는지 처음 알았네요 :)

정재남님의 프로필 이미지
정재남
지식공유자

내용 수정(추가)했어요!

이태경님의 프로필 이미지
이태경
질문자

오.. 더 자세하게 답변 감사합니다!

여기에 댓글 다는건 알람이 안오나보네요ㅎㅎ, 이제 확인했습니다! 감사합니다~!

1

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. 이태경님!

scrollSpy 바닐라 버전에서 data-index를 찾는 코드에 대해 문의 주셨군요. 네비게이션 버튼 클릭 시 부모 li의 인덱스를 찾기 위해 e.composedPath() 대신 closest('li') 메서드 사용에 대한 의견을 주셔서 감사합니다.

e.composedPath()는 이벤트의 발생 경로를 배열로 반환하며, 이벤트가 위로 버블링되는 경로를 추적할 수 있게 도와줍니다. 이를 통해 클릭한 요소와 관련된 여러 중간 단계를 상세하게 탐색할 수 있는 장점이 있습니다. 반면, closest('li') 메서드는 클릭한 타겟에서부터 DOM 트리를 거슬러 올라가면서 가장 가까운 li 요소를 찾을 때 유용합니다.

강의에서 e.composedPath()를 사용한 이유는 경로의 모든 요소를 순회하면서 원하는 조건에 맞는 요소를 탐색하기 위함일 수 있습니다. 이는 특히 복잡한 DOM 구조의 경우, 이벤트가 발생한 위치에 대한 좀 더 상세한 정보를 얻고, 원하는 대상을 정확하게 찾기 위한 유연성을 제공합니다.

하지만, 이 경우와 같이 단순히 가장 가까운 li 요소를 찾는 것이 목적이라면, closest('li') 메서드도 충분히 적절하고 유용한 대안이 될 수 있습니다. 코드를 작성하실 때 코드의 가독성과 유지보수성을 고려하여 적절한 메서드를 선택하시면 됩니다.

관련하여 더 깊은 이해와 토론이 이루어진 질문으로는 css 만으로 아코디언 애니메이션을 적용할 경우, 다른 libary들은 코드로 그부분들을 해결해주고 있는걸까요? 게시물에서 개발자들이 서로의 경험을 공유하는 것을 참고하실 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.