본문 바로가기
IT 자료

javascript Table cell merge(셀병합)

by 성곤 2017. 9. 22.
반응형


* 이 소스는 제이쿼리가 필요합니다.



table cell merge에 관한 자바스크립트를 찾을려고 했지만, 구글도 도와주지 않는지 내 검색 키워드가 잘못된 건지 나오지는 않더라... 그래서 직접 만들어봤습니다!!


처음에 만들려고 마음 먹었다가 귀찮아서 손 놓고 놀고 있다가, 이 기능을 찾는 친구가 있어서... ㅠ


될듯 안 될듯 개빡세네요... ㅠ




소스는 다음과 같습니다.



샘플소스 다운로드

tableMerge.html



샘플 예제

http://toyuq.woobi.co.kr/dev/tableMerge.html



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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
 
fn_cellMerge('table_id', [0,1,2]);
 
 
 
/** Function, Table Cell Merge
 *
 * @param : table id
 * @param : arrangement of column, ex) [0, 1, 2]
 * @param : group tag of column [option]
 * @author : toyuq
 * @version : 2017.09.22
 */ 
function fn_cellMerge(vid, vcol, vtd){ //테이블 아이디, 셀머지할 컬럼 0부터~, 태그(옵션)
  
  
      
    var id = vid;
    var col = vcol;
    var td = ((!!vtd) ? vtd : "td"  ); // 기본이 td 태그 기준으로 merge함
      
    var spanCnt = 1;
    var preText; //이전 텍스트
   
    var r = [];
 
    var rows = $("table[id="+id+"] tr").find(td+":eq("+col[0]+")").length//row 개수
   
    if(rows <= 1){
        return false;
    }
   
   
   
    for(var i = 0; col.length > i; i++){
   
        r.push({ idx : [], spans : []});
   
        if(i == 0){ //첫번째
       
            $("table[id="+id+"] tr").find(td+":eq("+col[i]+")").each(function(index, item){// row수만큼 돌린다.
              
                if(index == 0) { //첫번째 row
                  
                    r[i].idx.push(index);
                    spanCnt = 1;
              
                }else if( (rows-1== index){ //마지막 row
               
                    if(preText != $(this).text()){ //중복없이 단일행 마지막
                   
                        r[i].idx.push(index);
                        r[i].spans.push(spanCnt);
                       
                    }else//전 값이 동일한 경우
                   
                        spanCnt = spanCnt+1;
                        r[i].spans.push(spanCnt);
                    }
                   
                }else if(preText != $(this).text()){ //텍스트가 바뀔때 index
                  
                    r[i].idx.push(index);
                    r[i].spans.push(spanCnt);
                    spanCnt = 1;
              
                }else//위 아래 텍스트가 같을 때
                  
                    spanCnt = spanCnt+1;
                }
                preText = $(this).text();
            });
        }else if!r[i-1].idx.length){ // rowSpan할 row가 없다면 종료
       
            break;
           
        }else//그 뒤 그룹으로
       
            var j = 1//그룹 구별자
           
            $("table[id="+id+"] tr").find(td+":eq("+col[i]+")").each(function(index, item){// row수만큼 돌린다.
              
              
                if(index == 0) { //첫번째 row
                  
                    r[i].idx.push(index);
                    spanCnt = 1;
              
                }else if(r[i-1].idx[j] == (index)){ //rowSpan 적용 시작 지점에서 리셋
                   
                    r[i].idx.push(index);
                    r[i].spans.push(spanCnt);
                    spanCnt = 1;
                    j++;
                  
                }else if( (rows-1== index){ //마지막 row
               
                    if(preText != $(this).text()){ //중복없이 단일행 마지막
                   
                        r[i].idx.push(index);
                        r[i].spans.push(spanCnt);
                       
                    }else//전 값이 동일한 경우
                   
                        spanCnt = spanCnt+1;
                        r[i].spans.push(spanCnt);
                    }
                  
                }else if(preText != $(this).text()){ //텍스트가 바뀔때 index
                  
                    r[i].idx.push(index);
                    r[i].spans.push(spanCnt);
                    spanCnt = 1;
              
                }else//위 아래 텍스트가 같을 때
                  
                    spanCnt = spanCnt+1;
                }
                preText = $(this).text();
            });
        }
    }
 
   
    for(var k = col.length; k > 0; k--){ //역순으로 돌려야 그룹이 안깨짐
   
        $("table[id="+id+"] tr").find(td+":eq("+col[k-1]+")").each(function(index, item){
      
            if(r[k-1].idx[0== index){
              
                $(this).attr("rowspan",r[k-1].spans[0]);
              
                r[k-1].idx.shift();
                r[k-1].spans.shift();
              
            }else{
              
                $(this).remove();
            }
        });
   
    }
}
cs




반응형

'IT 자료' 카테고리의 다른 글

javascript 천단위 콤마  (0) 2017.09.29
새창(팝업) post으로 파라미터 넘기기  (0) 2017.09.26
java json형태 String을 map으로 변환  (0) 2017.08.18
javascript 배열 재구성  (0) 2017.07.06
ajax 오류 메시지 처리  (0) 2017.07.04