javascript plugin/typeahead
검색어 자동완성 - typeahead 사용법(일반, ajax) - 삽질중인 개발자
개발 N년차
2020. 12. 24. 22:41
반응형
- typeahead 사용법 정리 -
typeahead는 검색어 자동완성 기능을 제공하는 자바스크립트 라이브러리다.
jQuery에 있는 autocomplete 도 있는데 둘 다 사용해보니까 typeahead가 사용법이 간단해 괜찮은 거 같다.
우선 typeahead 를 사용하기 위해서는 링크에서 typeahead를 다운로드한다.
다운로드한 파일 중 사용하게 될 파일은 typeahead.bundle.js 이다.
jQuery 기반 라이브러리라 jQuery가 필수다.
<script src="/resource/jquery-3.5.1.js" ></script>
<script src="/resource/typeahead.bundle.js"></script>
typeahead는 따로 기본 CSS가 없어서 아래의 Style Sheet를 복붙 한다.
<style>
.typeahead-div{width : 400px;}
.tt-menu {width :100%;}
.typeahead,.tt-query,.tt-hint {height: 30px;padding: 8px 10px;font-size: 24px;line-height: 30px;border: 2px solid #ccc;-webkit-border-radius: 8px;-moz-border-radius: 8px;border-radius: 8px;outline: none;}
.typeahead {background-color: #fff;}
.typeahead:focus {border: 2px solid #0097cf;}
.tt-query {-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);}
.tt-hint {color: #999}
.tt-dropdown-menu {margin-top: 3px;padding: 8px 0;background-color: #fff;border: 1px solid #ccc;border: 1px solid rgba(0, 0, 0, 0.2);-webkit-border-radius: 8px;-moz-border-radius: 8px;border-radius: 8px;-webkit-box-shadow: 0 5px 10px rgba(0,0,0,.2);-moz-box-shadow: 0 5px 10px rgba(0,0,0,.2);box-shadow: 0 5px 10px rgba(0,0,0,.2);}
.tt-suggestion {width: calc(100%-20px);padding: 3px 10px ;font-size: 18px;line-height: 24px;color: black;cursor: pointer;}
.tt-suggestion.tt-cursor {color: #fff;background-color: #cccccc;}
.tt-suggestion p {margin: 0;font-size: 18px;text-align: left;}
</style>
1. typeahead 기본 사용법
typeahead 는$.typeahead( 플러그인에 대한 설정, 결과 데이터에 대한 설정 )으로 옵션을 구분한다.
다른 옵션들이 있긴하지만 밑에 나열한 옵션정도면 충분하다.
let substringMatcher = function(stringArray) {
return function findMatches(searchWord, cb) {
let matches, substringRegex;
// 추천 목록으로 보여질 배열
matches = [];
// searchWord로 만들어질 정규 표현식
substrRegex = new RegExp(searchWord, 'i');
//정규 표현식으로 가지고 있는 배열에서 탐색
$.each(stringArray, function(i, str) {
if (substrRegex.test(str)) {
//정규 표현식 일치하면 추천 목록에 푸시
matches.push(str);
}
});
cb(matches);//뿌려주는 함수
};
};
let states = ['김밥','김치','김치볶음밥','신라면','진라면','불닭볶음면','참치김밥','야채김밥'];
$('.typeahead').typeahead({
hint: true, // 나머지 글자가 자동으로 보여지는지
highlight: true,// 일치하는 문자 하이라이팅
minLength: 1 // 검색 시작하는 최소 문자 길이
},
{
limit: 5, // 자동완성 목록에 보여질 개수
name: 'states',
source: substringMatcher(states), // source가 검색어 추천에 목록으로 뿌려질 목록이다.
templates: {
header: '<h3 class="league-name">음식</h3>',// 추천 목록 헤더
empty: [
'<div class="empty-message">',
'일치하는 결과가 없습니다',
'</div>'
].join('\n') // 일치하는 결과가 없을때
}
}
);
위와 같은 경우는 자동완성 기능의 검색어가 미리 정해져 있는 경우에 사용할 수 있는 방법으로 배열에 검색어를 담아서 사용한다.
2. typeahead ajax 사용법
요즘 대부분의 경우에는 ajax를 통해서 자동완성 기능을 구현한다.
GET /search/{searchKeyword} 라는 API가 있고 응답이 {code: String, item : Array} 인 경우
자동완성을 구현하는 예제이다.
$('.typeahead').typeahead({
hint: true, // 나머지 글자가 자동으로 보여지는지
highlight: true,// 일치하는 문자 하이라이팅
minLength: 1 // 검색 시작하는 최소 문자 길이
},
{
name: 'tags',
source: function (query, syncResults, asyncResults) {
return $.ajax({
url: "/search/"+query, // query 는 검색창에 입력된 단어이다.
type: 'get',
success: function (response) {
//response = { code:"200",item:['김밥','김치','김치볶음밥','신라면','진라면','불닭볶음면','참치김밥','야채김밥'] }
let item = response.item;
return asyncResults(item); //asyncResults 에 배열을 넘기면 된다.
}
})
}
}
);
asyncResults 에 배열을 넣어주면 ajax를 통한 자동완성을 구현할 수 있다.
다른 참고할 만한 예제는 여기에 있다.
반응형