-
[개발일지05/🌉포폴사이트 JS] 프로젝트 상세보기 버튼에 detail.html 페이지 연결프로젝트 기록/포트폴리오 사이트 2024. 3. 27. 23:22
✅ 오늘의 작업 내역
1. 상세 보기 버튼에 detail.html 연결
2. detail.html 마크업 진행(10%)1. 상세보기 버튼에 detail.html 연결
<a> 태그에 직접적으로 url을 연결해 줬다가 동적으로 portfolio 요소를 생성하고 있으니 페이지 이동도 자바스크립트로 처리해 주는 게 맞다는 생각이 들었다. 문제는 동적으로 요소가 추가되는 경우 추가되지 않은 요소는 DOM에 존재하지 않아 이벤트 핸들러를 바인딩할 수 없는 이슈 1)를 마주하게 되었다.
👾 이슈 1) Uncaught (in promise) project.is:170 TypeError: Cannot read properties of null (reading 'addEventListener')
button에 id를 주고, onclick을 통해 함수로 이벤트 처리를 해주려고 했다. 하지만 함수 자체를 찾을 수 없다는 에러 및 id값을 읽지 못하는 이슈를 발견했고, 해결 방법을 찾아본 결과 이때 이벤트 위임을 활용하여 부모 요소에 이벤트 핸들러를 바인딩하여 원하는 요소를 제어할 수 있다는 것을 알게 되었다.
🛠️ 이벤트 핸들러 추가
이벤트 핸들러를 바인딩 해줄 요소는 portfolio라는 id값을 가지고 있는 부모 컨테이너인 section이다. 이미 displayPortfolioData 함수에서 해당 요소를 참조하여 markup 변수에 할당해 줬기 때문에 createHTML 함수에 매개변수로 markup 변수를 추가해 줬다.
function displayPortfolioData(dataProtfolio) { const markup = document.querySelector("#portfolio"); const portfolioData = dataProtfolio.projects; const sectionTitle = dataProtfolio.sectionTitle.find( (title) => title === "PortFolio" ); markup.insertAdjacentHTML( "beforeend", createHTML(portfolioData, sectionTitle, markup) ); }
createHTML 함수에서 그려줄 요소들을 처리해 주는데, 이때 각 project와 detail 페이지가 매칭되도록 쿼리 스트링에 project id값을 통해 정보를 구분해 주기로 했다. 그리고 button에도 구분을 위해 id값을 할당해주었다.
function createHTML(portfolioData, sectionTitle, markup) { // stack 함수 mapping const detailPageURL = `./detail.html?id=${data.id}`; const projectCard = ` <article class="w-full h-ful bg-white rounded-2xl" id="project${data.id}"> // ... <button id="project-${data.id}" class="h-[4rem] rounded-[0.625rem] bg-green font-LINESeedKR-Bd text-white text-md flex items-center justify-center gap-1 hover:brightness-125 sm:text-lg lg:mt-4" >상세보기</button> </div> </div> </article> `;
이제 매개변수로 받아온 markup에 이벤트 핸들러를 바인딩해주는데, 이때 button이라는 것을 구분해주고자 조건 처리를 통해 detail 페이지를 할당해주면 성공!
markup.addEventListener("click", (e) => { if (e.target && e.target.id == `project-${data.id}`) { window.location.href = detailPageURL; } }); return projectCard; });
💡 적용 결과
2. detail.html 마크업 진행(10%)
datil.html 마크업도 진행 중!
구현된 화면은 바로 위의 적용 결과에서 볼 수 있다.
참고
[사이트] 모던 자바스크립트 딥다이브 - 5.33 Event(링크)
[유튜브] Build a Pokedex with Vanilla HTML, CSS, and JavaScript - How to Become a Developer(링크)
💬 본 포스팅은 공부 기록용으로 정확하지 않은 정보가 존재할 수 있습니다. 발견하신다면 알려주세요!
'프로젝트 기록 > 포트폴리오 사이트' 카테고리의 다른 글
[개발일지06/🌉포폴사이트 JS] detail 페이지 스타일링 - 프로젝트 정보 섹션, 탭 메뉴 (0) 2024.03.28 [개발일지04/🌉포폴사이트 JS] JSON 데이터 생성하기(objGen) (0) 2024.03.24 [개발일지03/🌉포폴사이트 JS] 이벤트 위임으로 addEventListener 사용 빈도 줄이기 (0) 2024.03.20 [개발일지02/🌉포폴사이트 JS] 햄버거 버튼을 사용하여 요소를 토글할 때 Tailwind에서는 어떤 클래스를 사용하면 좋을까? (0) 2024.03.18 [개발일지01/🌉포폴사이트 JS] 메뉴 리스트 <li> 태그 전체에 링크 걸기 (0) 2024.03.15