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

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

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

1개월 ago

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

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

1개월 ago

[이미르] 대기열 왜 이렇게 길어졌나? (중국작업장/매크로)

#레전드오브이미르 #작업장 #쌀먹 #중국 #매크로 #대기열 1. 운영 문제 있네? 이제 오픈 2주차에 들어온 위메이드의…

2개월 ago

[이미르] 엠틱을 챙겨보자 (스토리덱/마나회복력)

#레전드오브이미르 #엠틱 #마나회복력 #스토리덱 1. 마나가 너무 부족해! 레전드 오브 이미르는 스킬 위주의 액션 게임이라고…

2개월 ago

[이미르] 시구르드와 대화 (위치/메인퀘스트19-19)

#레전드오브이미르 #파괴가남긴것 #시구르드 #19-19 #위치 1. 파괴가 남긴 것 레전드 오브 이미르 메인퀘스트 19-19인 "파괴가…

2개월 ago

[이미르] 트롤의 비밀상자, 트롤의 유적상층 보물상자 위치

#레전드오브이미르 #트롤의비밀상자 #트롤의유적상층 #보물상자 #위치 1. 트롤의 비밀 상자 이번에 알아 볼 의뢰게시판 의뢰는 바로…

2개월 ago