Record4me

시작하면 끝을 봐야지

TIL

[TIL] 24_0102 검색 기능과 setAtrribute()와 classList.add()

잇츄미 2024. 1. 2. 20:59

검색 기능

아직 CSS 입히기 전인 검색 기능만 완성된 화면이야. 

필수 사항은 다 있고 선택 사항으로 검색어 입력 시에 대,소문자 상관없이 검색 가능하도록 할거야.

추가로 검색어치고 엔터치면 검색기능이 작동해.

 

트러블슈팅

setAtrribute()와 classList.add()

 

문제- 동적으로 요소를 생성하고 거기에 동적으로 클래스 속성과 속성명을 붙여주려고 classList속성의 add()메서드를 사용했는데 값이 undefind가 떴어.

 

원인 - classList를 언급해 주지 않았고, 기존에 클래스 속성과 속성명이 없는 상태에서 사용하려고 했어.

 

먼저 원본 HTML

-HTML

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style></style>
  </head>
  <body>
    <h1>최고 평점 영화 콜렉션</h1>
    <h2>영화 검색 :</h2>
    <input type="text" id="input" placeholder="영화 제목을 검색해 보세요" />
    <button id="searchBtn" type="button">검색</button>
    <div id="cards-container"></div>
  </body>
</html>

 

 

 

-javascript

1-js

// 2-2. 화면에 보이기
        movies.forEach((mainCards, i) => {
          const $mainCardsDiv = document.createElement("div");
          // 2-3. 생성한 div에 클래스 붙여주기
          $mainCardsDiv.setAttribute("class", "card-content");
          $mainCardsDiv.innerHTML = `
              <div>id : ${mainCards.id}</div>
              <img src="https://image.tmdb.org/t/p/w500${mainCards.poster_path}" alt="${mainCards.title}">
              <h3>제목 : ${mainCards.title}</h3>
              <p>내용 요약 : ${mainCards.overview}</p>
              <p class="Rating">Rating : ${mainCards.vote_average}</p>
            `;

          return $cards.append($mainCardsDiv);
        });

 

 

// 클래스 속성과 속성명 생성 방법으로 이 2가지를 고려했어

// 결국 사용한 건 1번째 방법이야

2-js

1. $mainCardsDiv.setAttribute("class", "card-content");

//시도 - classList.add를 이용한 클래스명 생성
2. const $newCards = $mainCardsDiv.classList.add("card-content");

 

1번째 방법인 setAttribute메서드는 원래 기본 요소에 아예 없는 클래스 속성과 속성명을 '생성'하는 데에 쓰고 

 

2번째 방법은 기존에 classList라고 class들이 원래 있는 요소에 class 명을 지정/추가할 때 써.

예를 들어, HTML 기존 요소에 <div class="dooly" ></div>라고 이미 클래스 속성과 속성명이 있어.

css할 때 편하려고 클래스명을 동적으로 생성해주고자 해 그래서 classList.add("ddochi")라고 생성해주면 기존에 있던 class속성에 속성명 ddochi가 추가되서 <div class="dooly ddochi"> 이렇게 한 요소에 클래스가 하나 더 추가하는거야.

dooly는 js에서 쓰면 ddochi는 css클래스로 쓸 수 있겠지. 

 

나같은 경우는 1-js에서 document.createElement(" ")를 이용해서 없는 걸 생성해서 아예 클래스도 없는 기본 요소인 것에서 클래스를 붙이는 것이기 때문에 setAttribute를 써야했는데 classList를 이용해서 기존에 클래스속성이 원래 없는 데도 클래스 속성을 붙이려고하니까 안 붙었던 거야. 게다가 classList도 언급해주지 않아 휴먼에러도 있었지.

 

대신, 가능하게 사용한다면 위 코드에서 

const $mainCardsDiv = document.createElement("div");
          // 2-3. 생성한 div에 클래스 붙여주기
  $mainCardsDiv.setAttribute("class", "card-content");<=이렇게 기존에 생성됐으니
  const $newCards = $mainCardsDiv.classList.add("ddochi"); <=이렇게 추가가 가능해

 

이런 경우 기존에 클래스명 card-content가 이미 만들어진 셈이니 .add()로 두번째 클래스인 ddochi를 추가할 수 있어.

 

순수 자바스크립트

-검색 기능을 만들면서 내가 사용한 메소드들이야

document.querySelector("#searchBtn")

document.createElement("div");

element.innerHTML = `<div> </div>`
element.innerHTML = "";


element.append($mainCardsDiv)
=> append와 appendChild와 appendChildren이 있었는데
기능적으로 편하기도 하고 ie까지만 못 썼지 이젠 모든 브라우저에서 
사용 가능한 append을 쓰기로 정했어.

document.addEventListener("click", () => { });

         
//동적으로 새로운 요소 생성하고 새로 생성한 요소에 처음으로 클래스 속성과 속성명 붙여주기   
document.createElement("div");
element.setAttribute("class", "card-content");

 

 

느낀 점

- HTML, CSS, JQuery 자주 쓰다가 이렇게 순수 자바스크립트로 짜니까 색다르고 정말 재밌게 짠 거 같아.

- 나중에 class함수와 클로저도 써서 수정해 보려고. 효율적인 코드와 가독성있는 코드를 만들고싶어. 

 

 

*참고 사이트 : 

 

- https://ko.javascript.info/styles-and-classes

- https://velog.io/@pjeeyoung/setAtturibute-vs-classList 

- https://velog.io/@devjyu/className%EA%B3%BC-classList