Q 어떤 문제가 있었는지
미니 프로젝트의 방명록 페이지를 구현하면서 기존에 작성된 데이터를 불러올 때 사용할 태그를 미리 정의하고 사용했다.
(아래 이미지와 같이 데이터만 변경되고 사용되는 태그와 스타일이 동일하기 때문에 미리 정의를 해두었음)
초기 작성 코드는 다음과 같다.
const selector = (element) => document.querySelector(element);
const guestbookTemplate = (id, author, content) => {
selector(
"#itemList"
).innerHTML += `
<div class="item" id="${id}">
<p class="author">${author}</p>
<img class="cancle" src="../../photos/cancle.svg" alt="${author}의 방명록 수정을 취소하는 아이콘">
<img class="insert" src="../../photos/pencil.svg" alt="${author}의 방명록을 수정하는 아이콘">
<img class="update" src="../../photos/send.svg" alt="${author}의 수정한 방명록을 등록하는 아이콘">
<img class="delete" src="../../photos/trash.svg" alt="${author}의 방명록을 삭제하는 아이콘">
<p class="content">${content}</p>
</div>`;
위 코드를 사용하여 DOM Node에 접근하여 조작할 때 예상과 다른 값이 출력되어 조작하려고한 인덱스 위치에 있는 Node의 값을 출력해보니 '#text'가 들어가 있었고 부모 Node부터 e.target.parentNode.childNodes.forEach()로 확인해 보니 모든 태그 사이에 '#text'가 들어가 있었다.
그리고 마우스 클릭 이벤트를 두 번 실행해야 함수가 실행되는 문제도 있었다.
개발자 도구로 확인한 HTML 코드에서는 #text와 관련된 것은 보이지 않았다.
Q 내가 시도해본 것들
- console.log()로 클릭 이벤트가 정상적으로 동작하는지 확인
- 첫 클릭에는 log가 출력되지 않고 두 번째 클릭에 이벤트가 발생
- 비슷한 문제를 겪은 경험자의 기록이 있는지 구글링
- 두 번 클릭되는 이유를 물어보는 글 중 나와 같은 케이스가 없었음
Q 어떻게 해결했는지
다음 코드처럼 빈 문자열없이 작성하면 '#text'가 포함되지 않고 두 번 클릭해야 이벤트가 발생하는 현상이 해결되었다.
` `내의 들여쓰기 부분이 문자열로 인식되어 발생한 것이다.
두 번 클릭 이슈는 공백 문자열과 무슨 연관이 있는지 솔직히 원인을 잘 모르겠다.
const guestbookTemplate = (id, author, content) => {
selector(
"#itemList"
).innerHTML += `<div class="item" id="${id}"><p class="author">${author}</p><img class="cancle" src="../../photos/cancle.svg" alt="${author}의 방명록 수정을 취소하는 아이콘"><img class="insert" src="../../photos/pencil.svg" alt="${author}의 방명록을 수정하는 아이콘"><img class="update" src="../../photos/send.svg" alt="${author}의 수정한 방명록을 등록하는 아이콘"><img class="delete" src="../../photos/trash.svg" alt="${author}의 방명록을 삭제하는 아이콘"><p class="content">${content}</p></div>`;
};
Q 무엇을 새롭게 알았는지
- ` `을 사용해 미리 태그를 정의할 때 들여쓰기 시 태그들 사이에 '#text'가 추가되어 DOM Node 조작이 예상과 다르게 동작
- HTML과 JS에 대한 추가 공부가 필요
'JavaScript' 카테고리의 다른 글
[JavaScript] fetch (0) | 2024.06.03 |
---|---|
[JavaScript] URL에서 쿼리 문자열 추출 방법(URLSearchParams) (1) | 2024.04.18 |
동일한 className을 사용하는 HTML 요소의 이벤트 처리 (0) | 2024.04.18 |
JavaScript의 Module (0) | 2024.04.16 |