JAVASCRIPT/JSTL

[JavaScript] 특정단어 하이라이트 주기

#자바스크립트 #제이쿼리 #JQuery #통합검색 #검색어표시 #단어표시 #replaceAll #CDN #자바스크립트

안녕하세요, 배곧동개발자 입니다.

여러 사이트에서 검색을 했을 때에 하이라이트 표시되는거 한번씩은 보였죠?

이걸 자바스크립트로 구현을 한번 해보도록 하겠습니다-

<div class="notice" id="notice">
    안녕하세요, 배곧동개발자입니다<br/>
    아주 간단히 하이라이트를 주는 방법을 알아볼게요-<br/>
    위에 input에 텍스트를 넣고 엔터 눌러보세요!  
</div>

먼저 이런 소스가 하나 있고 여기서 특정 단어 “배곧동”에 하이라이트를 주려고 한다고 가정해봅시다.

$(“#notice”).html()을 보시면 html태그까지 모두 읽히는거 보이시나요?

“배곧동”을 태그로 감싸주고 css를 입힌다.

라는게 이번 포스팅의 핵심인데요- 소스를 한번 봐보겠습니다!

// html을 불러와서
var t = $("#notice").html();
// 내가 검색한 부분에 class를 씌우기
t = t.replace(value, "<font class='highlight'>"+value+"</font>");
// 적용
$("#notice").html(t);

주석을 달아놨는데 다시 한번 설명을 해드리면 replace를 사용하는겁니다! replace를 사용해서 배곧동을 <font class=”highlight”>배곧동</font> 로 만들어주는 것이지요.

간단히 만들어놓은 폼으로 한번 봐봅시다-

replace를 이용해서 font태그를 입혀주니 저렇게 내가 원하는 단어가 딱 쉽게 보이지요? 하이라이트 주기 참 쉽습니다-

하지만, 우리 여기서 한단계 더 나아가볼까합니다! “요” 를 검색했는데 가장 위에 하나만 하이라이트를 먹고 나머지는 먹지 않았습니다-

생각해보니 자바스크립트의 replace는 하나만 바꿔주고 끝나지요? replaceAll 이 불가능합니다!!

그렇기에 이걸 써줍니다.

function replaceAll(t, a, b){
    return t.split(a).join(b);
}

split와 join을 이용해 구현한 replaceAll. 이걸 써줌으로써 완전체로 완성! 소스를 한번 쭉 보자면

<!DOCTYPE>
<html>
<head>
<script src="https://code.jquery.com/jquery-3.0.0.min.js"></script>

<style type="text/css">
 .layout {width:200px; height: 200px; border: 1px solid #4374D9; border-radius: 10px; padding: 30px; text-align: center; margin: 50px;}
 .search{text-align: center; height: 30px;}
 .highlight{color:white; font-weight: bold; background-color: black;}
 .notice{margin-top: 20px; font-size: 13px; line-height: 2em}
</style>

<script type="text/javascript">
 // 최초값 저장하기 위한
 var ori = "";
 function init(){
  ori = $("#notice").html();
 }

 function search(value){
  // 최초값으로 초기화
  $("#notice").html(ori);
  // html을 불러와서
  var t = $("#notice").html();
  // 내가 검색한 부분에 class를 씌우기 (하나만 바뀜)
  // t = t.replace(value, "<font class='highlight'>"+value+"</font>");
  // 전체가 다 바뀌도록 replaceAll 구현
  t = replaceAll(t,value,"<font class='highlight'>"+value+"</font>");
  // 적용
  $("#notice").html(t);
 }
 
 // replaceAll 구현
 function replaceAll(t, a, b){
  return t.split(a).join(b);
 }
</script>


</head>
<body onload="init();">
 <div class="layout">
  <input class="search" type="text" placeholder="무엇을 표시할까?"  onkeydown="if(event.keyCode == 13){search(this.value);}" />
  <div class="notice" id="notice">
   안녕하세요, 배곧동개발자입니다<br/>
   아주 간단히 하이라이트를 주는 방법을 알아볼게요-<br/>
   위에 input에 텍스트를 넣고 엔터 눌러보세요!  
  </div>
 </div>
</body>
</html>

이런식으로 됩니다.

어떠신가요? 통합검색 비슷하게 뭔가 만들일이 있거나 문자열 검색을 하는 시스템을 만드실 때 필요한 기능! 로직을 고민할 때는 복잡해보였으나 막상 결과물을 보니 별거 없죠?

이것이 개발이 묘미! 다들 재미있게 개발합시다-

이만, 배곧동개발자 였습니다.

배곧동개발자

Recent Posts

[세븐나이츠 리버스] 쫄작 가이드 (기초편)

#세븐나이츠리버스 #쫄작 #가이드 #꿀팁 #제이브 그 옛날, 세나를 해보신 분들이라면 모를 수 없으나 이제 세븐나이츠…

3주 ago

[세븐나이츠 리버스] 최신 쿠폰 공유! 쿠폰 입력 방법! (5월15일)

1. 세븐나이츠 리버스 오늘, 2025년 5월 15일에 오픈한 세븐나이츠 리버스! 다들 시작하셨나요? 제이브를 뽑고싶은데 아직…

3주 ago

[CSS] 이미지가 빙빙 돈다? animation spin

#css #spin #animation #spin 1. 이미지가 빙빙돈다! 어? 이게 뭐지? 이미지가 빙빙 돕니다. 나 이거…

1개월 ago

[node.js] npm.ps1 파일을 로드할 수 없습니다

#노드js #nodejs #에러 #오류 #npm 1. npm.ps1 Error node js 를 설치 후 npm을 이용하려…

2개월 ago

[MSSQL] 넓은 영어, 띄어쓰기 영어 입력되는 현상 (전각입력/문자폭)

#MSSQL #문자폭 #영어넓이 #쿼리입력안됨 1. MSSQL 영어 입력 안되는 현상 MSSQL을 주로 쓰고 있는데 MSSMS에서…

3개월 ago

[이미르] 다니아믹 키 확실한 해결방법 (커스텀토큰/접속불가)

#레전드오브이미르 #다이나믹키가다릅니다 #커스텀토큰 #접속불가 #오류 #해결방법 1. 다이나믹 키 더럽다! 유저의 다이나믹키가 다릅니다. 위메이드의 레전드…

3개월 ago