본문 바로가기
컴퓨터

[웹] 검색어 추천 기능(html, css, javascript)

by skyjwoo 2023. 4. 24.
728x90
반응형

 

배경

 

KBO 선수 퀴즈를 만들면서 검색어 추천창이 필요했다.

검색어 추천창은 검색 시 창에서 관련 검색어 리스트화하고 아래와 같은 기능들을 수행해야 한다.

 

특징1. 추천 리스트 클릭 가능 - 클릭 시 검색 창 반영 (DOM + function 추가)

특징2. 추천 리스트에 마우스 올리면 색 변화(CSS)

 

아래는 검색어 추천 창을 임시로 구현 후 사용 예시이다.

 

검색어 추천

 

코드 구현

 

해당 내용을 코드로 구현한 결과는 아래와 같다. 

 

창 구성

 

페이지의 구성은 검색창(id=name)과 추천창(id=suggestion_box)으로 구성된다. 

해당 페이지의 html 코드는 아래와 같다. 

 

  <body>
    <div class = "search_wrapper">
      <div class = "mid_wrapper">
      	<!-- 검색창 -->
        <input type="text" id = "name" autocomplete="off">
        <!-- 검색버튼 -->
        <input type="button" id = "submit_button" value="검색"> 
      </div>
      <!-- 추천창 -->
      <div id="suggestion_box" class = "invisible">
        <div id = suggested_items></div>
      </div>
    </div>
  </body>

 

검색창(위), 추천창(아래)

 

'검색 창'과 '버튼'을 위쪽에 두고, 아래쪽에 '추천창'을 두었으며 default를 'invisible'로 설정하였다. (검색어 입력시 해당 클래스를 지워서 추천창이 보여지도록 css에 구현하였다.)

또한 검색 창 내에는 각 검색어들을 따로 포함할 div를 따로 두었으며(id=suggested_items) 많은 추천어들이 들어갈 수 있도록 구현하였다.

 

다음은 css 코드이다.

 

.search_wrapper {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
}

#name {
    width: 200px;
    height: 20px;
}  

.invisible{
    display: none;
}


#suggestion_box {
    margin-top: 1px;
    background: white;
    padding: 0 10px;
    border: 1px solid black;
}

#suggested_items{
    height:100px;
    width: 250px;
    overflow: auto; /* 스크롤바 추가 */
}

/* 마우스 올리면 색 변화 */
.item:hover{
    color: #fff;
    background-color: lightgreen;
}

특징적인 부분은 두 부분이다. 

 

1. #suggested_items 부분에서 overflow 값을 주어 내용이 많아지면 스크롤바가 생성되게 하였다.

2. suggested_items에 들어가게 되는 item들에 대해 hover 정보를 추가하여 마우스가 올려졌을 때 해당 div의 색이 변화되도록 하였다. 

 

함수 구현

 

다음은 JS 코드이다.

 

구현한 내용은 서버로부터 'items(추천 검색어)'를 받았다고 가정하고 작성하였다. 

 

1. #name에 키보드 입력 시 작동 함수 : class=invisible값을 지워, 추천 창이 보이도록 한다. 

2. #suggested_items 내에 기존 검색 추천 데이터가 있으면 지우고 새로 넣어준다. (DOM, div 지우고 새로 생성)

3. 서버로부터 받은 items(추천 검색어)를 순회하면서 .item div를 생성해주고(#suggested_items의 하위 div) click 시 #name(검색창)에 추천검색어를 넣어주는 eventListener를 추가해준다.

 

// DOM
$(function() {
  $("#name").keyup(function() {

    const recommendBox = document.querySelector("#suggestion_box");
    
    // invisible을 지워준다.
    recommendBox.classList.remove('invisible');
    const input_name = document.getElementById("#name");
    
    // 기존 검색 추천 데이터 지우고, 새로 넣어주기 안 그러면 계속 추가됨
    recommendBox.innerHTML = "";

    const suggestedItems = document.createElement('div')
    suggestedItems.id = "suggested_items"

    recommendBox.appendChild(suggestedItems);

    // item별 리스트
    var items = ['강백호', '박해민', '이정후', '원태인', '구자욱', '오승환'];
    
    // for문 돌면서 item 추가
    for (var i in items) {

      var player_content = document.createTextNode(items[i]);
      var suggestedItem = document.createElement('div')
      suggestedItem.className = "item"

      suggestedItem.addEventListener('click', function(e){
        document.getElementById("name").value = this.textContent.split(' ')[0];
      });

      suggestedItem.appendChild(player_content);
      suggestedItems.appendChild(suggestedItem);
    }
  })
})

 

최종 구현한 코드 전문은 아래와 같다.

See the Pen query _recommendation by 윤정우 (@aaxxlfde-the-typescripter) on CodePen.

 

 

 

728x90
반응형

댓글