728x90
반응형

에디터에서 흔히 많이 사용되는 input 영역에 2개 이상의 태그를 작성하기 위한 기능이 필요했다.

jQuery에서 사용할 수 있는 plugin을 찾아보니 Suggestags 라는 것이 있어 사용하기로 했다.

 

* plugin file download : https://github.com/amsify42/jquery.amsify.suggestags

* 환경 : jQuery v3.5.1, Bootstrap v4.5.3 사용, Suggestags 1.27.0 적용

 

1. plugin 적용

1
2
<link rel="stylesheet" href="/css/amsify.suggestags.css">
<script src="/js/jquery.amsify.suggestags.js"></script>
cs

 

2. 적용할 태그

1
<input type="text" class="form-control" id="tagsTxt">
cs

 

3. 내 소스에 적용

3-1. 기본 가이드

plugin  가이드 : https://openbase.com/js/suggestags/documentation

javascript 객체 상수 (constant) : https://webclub.tistory.com/527

기본적인 사용방법은 해당 가이드를 사용하면 된다.

3-2. 내가 필요했던 기능

1) javascript로 태그를 전부 다른 값으로 변경해야 한다.

2) javascript로 태그를 하나 추가하고 싶다.

3) 태그가 변경될 시 callback 이벤트를 사용하고 싶다.

3-3. 기존 소스의 문제점

다만 3-2의 내용들을 사용하기 위해서 refresh를 사용했는데

이 경우 기존에 선언시 설정했던 정보가 모두 날아가는 문제가 있었다.

 

3-4. 그래서 아래와 같은 함수를 만들어 적용했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
// plugin 사용을 위한 값 세팅
definedValues();
// plugin 적용
usedSuggesTagsPlugin($('#tagsTxt'), 'init');
 
// 태그 전체 변경 변경시 
// tagsList : 'tag1,tag2' 형태의 스트링
usedSuggesTagsPlugin($('#tagsTxt'), 'setTags', {tags:tagsList});
 
// 태그 하나 추가 시
usedSuggesTagsPlugin($('#tagsTxt'), 'addTag', {tags:tag});
 
// javascript 객체 상수 (constant), 출처 : https://webclub.tistory.com/527
function definedValues(){
    constant.set('suggestagsSetting', {
        tagLimit : 10,                                      // 태그 최대 갯수 제한
        tags : '',                                          // 입력되는 태그 값
    });
}
 
/**
 * Suggestags의 사용을 위한 보조 함수
 * 출처 : https://openbase.com/js/suggestags/documentation
 * @param selector  : jquery형 selector
 * @param action    : 어떤 형태의 작업인지
 * => init : 사용을 위한 선언
 * => setTags : js로 태그 전체 변경시
 * => addTag : js로 태가 하나 추가시
 * => getClass : plugin에서 사용되는 클레스 값 전체를 구할때
 * @param value     : object형, action이 getClass인 경우 사용함
 * @returns
 */
function usedSuggesTagsPlugin(selector, action, value){
    if (isNull(selector))
        throw ': we need selector info for Suggestags plugin!';
    
    var objValue = !isNull(value) ?
            Object.assign(constant.get('suggestagsSetting'), value) 
            : constant.get('suggestagsSetting');
    
    // 선언시 세팅값 정의
    var objInit = {
            // 태그 반경시 callback 이벤트 설정
            afterAdd : function(e) {
                checkTagValuse();
            },
            afterRemove : function(e) {
                checkTagValuse();
            },
    };    
    if (!isNull(objValue) && !isNull(objValue.tagLimit) && Number(objValue.tagLimit) > 0) {
        Object.assign(objInit, {
            tagLimit: objValue.tagLimit
        });
    }
    
    // plugin 적용
    if (isNull(action) || action == 'init') {
        init();
        return;
    }
    
    if (!isNull(action) && (action == 'setTags' || action == 'addTag'
            && !isNull(objValue) && !isNull(objValue.tags)) {
        // refresh 사용시 tagLimit와 같은 기존 세팅 값이 초기화 되므로 재생성하도록 처리
        init();
        if (action == 'setTags') {
            var arrValue = objValue.tags.split(',');
            $.each(arrValue, function(i, e){
                amsifySuggestags.addTag(e.trim());
            });
            return;
        } else if (action == 'addTag') {
            amsifySuggestags.addTag(objValue.tags.trim());
            return;
        }
    } else if (!isNull(action) && action == 'setTags' 
        && !isNull(objValue) && isNull(objValue.tags)) {
        init();
        return;
    }
    
    /**
     * 사용예
     * 1. 아직 반영되지 않은 입력중인 태그 값을 구할때
     *  : $('input[class="'+usedSuggesTagsPlugin(selector, 'getClass').sTagsInput.substring(1)+'"]').val()
     */ 
    if(!isNull(action) && action == 'getClass') {
        amsifySuggestags = new AmsifySuggestags(selector);
        return amsifySuggestags.classes;
    }
    
    
    /* 내부함수 - 시작 */
    function init(){
        if (action != 'addTag') selector.val('');
        amsifySuggestags = new AmsifySuggestags(selector);
        amsifySuggestags.destroy();
        amsifySuggestags = new AmsifySuggestags(selector);
        amsifySuggestags._settings(objInit);
        amsifySuggestags._init();
    }
    
    // 태그 변경 시 이벤트 
    function checkTagValuse(){    
        // 입력된 태그 값을 비교하여 같거다 다른 경우 분기
    }
    /* 내부함수 - 끝 */
}
 
/**
 * param이 null, undefined, 공백 포함 빈 스트링인 경우 true, 값이 있는 경우 false
 * @param param
 */
function isNull(param){
    if(typeof param == "undefined" || param == null || param.length == 0
            || (typeof param == 'string' && (param == "" || param.trim().length == 0)))
        return true;
    else
        return false ;
}
cs

 

 

 

분명히 더 아름다운 방법이 있겠지만 우선 이렇게 마무리 했다.

(어후 삽질이야...)

 

728x90
반응형

+ Recent posts