jQuery에서 HTML 테이블 다루는 예 ( jQuery Table Handling example)
테이블의 셀에 들어있는 숫자를 대상으로 jQuery를 이용하여 가로/세로 합산 출력 및 정렬기능 구현 예
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>jQuery Table Handling</title>
<style type="text/css">
body { text-align: center;}
table
{ display: inline-block;
text-align: center; width:400px;
border:1px dotted blue;
}
td { width: 200px; border-bottom: 1px dotted blue; }
</style>
<script type="text/javascript" src="jquery-2.1.1.min.js"></script>
<script type="text/javascript">
var arrBg = new Array();
var prevIdx;
$(document).ready(function() {
//테이블 헤더의 색상과 바닥 테두리를 설정한다
$('tr:first>th').css({
'borderBottom':'3px double black',
'backgroundColor':'lightblue'
})
//마지막 행의 바닥 테두리를 설정한다
$('tr:last>td').css('border-bottom','3px double black');
//홀수 행에 속하는 td 에는 배경색상을 달리 설정한다
$('tr:odd>td').css('backgroundColor','lightgray');
//HTML5 custom attribute
var bg = $('td[data-bg]').attr('data-bg');
$('td[data-bg]').css('backgroundColor',bg);
var color = $('td[data-color]').attr('data-color');
$('td[data-color]').css('color',color);
//선택된 그룹에 다시 필터를 적용하여 특정 요소들만 최종적으로 선택한다
$('td:not([data-bg])').css('background-color','lightgray');
$('tr:has([data-bg])>td').css('backgroundColor',bg);
$('tr>td:nth-child(1)').css('backgroundColor','lightblue');
//특정 문자열을 가진 태그를 찾아서 배경색을 달리 설정한다
$('td:contains("B")').css('backgroundColor','red');
//각 컬럼의 배경색을 배열에 저장해두고 컬럼색상 복원시 사용한다
$('tr:eq(1)>td').each(function(index){
arrBg[index] = $(this).css('backgroundColor');
});
//각 컬럼의 헤드를 클릭하면 해당 컬럼 모든 셀의 배경색을 동일하게 변경한다
$('th').click(function() {
$("table tr:last[id=sum]").remove();
var currIdx = $(this).index()+1;
$('tr>td:nth-child('+currIdx+')').css('backgroundColor','yellow');
if(prevIdx!=null && prevIdx!=currIdx) {
var pidx = parseInt(prevIdx);
$('tr>td:nth-child('+prevIdx+')').css('backgroundColor',arrBg[pidx-1]);
}
prevIdx = currIdx;
//컬럼의 값을 정렬한다
sortColumn($(this).index());
//첫번째 컬럼의 헤더를 클릭한 경우
if($(this).index()==0) {
//각행의 첫번째 컬럼에 있는 숫자를 읽어서 합산한다
var sum = 0;
$("tr:not([id=sum])").each(function( index ) {
if(index>0) { //첫번째 행은 테이블 헤더이므로 건너뛴다
var val = $(this).children('td:first').text();
sum += parseInt(val);
}
});
//합산결과를 하단의 행에 출력한다
var tr = $(createTR()).css('background-color', 'lightblue');
tr.children('td:first').text('합계:'+sum);
$('table>tbody').append(tr);
}
});
//각행의 첫번째 컬럼을 클릭하면 해당 행의 모든 컬럼값을 합산하고
//행의 마지막에 컬럼을 생성하여 합산결과를 출력한다
$('tr:not([id="sum"])>td:nth-child(1)').click(function(e){
var sum = 0;
var tr = $(this).parent('tr');
tr.children('td').each(function(index){
if(index>=3) return;
if(isNaN($(this).text())) return;
sum += parseInt($(this).text());
});
tr.find('td[id=sum]').remove();
var td = $('<td id="sum"></td>').text('합계:'+sum);
td.css('backgroundColor','lightblue');
tr.append(td);
});
//alert('abc'>'ab'); //true
//alert('1' > '2'); // false
});
function createTR() {
return '<tr id="sum"><td></td><td></td><td></td></tr>';
}
var ASC = true;//디폴트 오름차순
function sortColumn(index) {
var arrTR = new Array();
var idx = 0;
$("tr:not([id=sum])").each(function( index ) {
if(index>0) { //첫번째 행은 테이블 헤더이므로 건너뛴다
//각 tr 행을 제거하면서 동시에 배열에 저장한다
arrTR[idx++] = $(this).detach();
}
});
var iv;
var jv;
for(var i=0;i<(arrTR.length-1);i++) {
for(var j=i+1;j<arrTR.length;j++) {
iv = arrTR[i].children('td:eq('+index+')').text();
jv = arrTR[j].children('td:eq('+index+')').text();
if(isNaN(iv) || isNaN(jv)) { //if not number
if(ASC) { //ASC
if(iv < jv) {
var tmp = arrTR[i];
arrTR[i] = arrTR[j];
arrTR[j] = tmp;
}
}else{ //DESC
if(iv > jv) {
var tmp = arrTR[i];
arrTR[i] = arrTR[j];
arrTR[j] = tmp;
}
}
}
else { //if number
if(ASC) { //ASC
if(parseInt(iv) < parseInt(jv)) {
var tmp = arrTR[i];
arrTR[i] = arrTR[j];
arrTR[j] = tmp;
}
}else{ //DESC
if(parseInt(iv) > parseInt(jv)) {
var tmp = arrTR[i];
arrTR[i] = arrTR[j];
arrTR[j] = tmp;
}
}
}
}
}
// Append the sorted rows to table
for(var i=0;i<arrTR.length;i++) {
$('table>tbody').append(arrTR[i]);
}
ASC = !ASC;
}
</script>
</head>
<body>
<table>
<tr><th>COL1</th><th>COL2</th><th>COL3</th></tr>
<tr><td>1</td><td>A</td><td>2</td></tr>
<tr><td>2</td><td>L</td><td>4</td></tr>
<tr><td>3</td><td>P</td><td>6</td></tr>
<tr><td>4</td><td>H</td><td data-bg='green'>8</td></tr>
<tr><td>5</td><td>A</td><td>10</td></tr>
<tr><td>6</td><td>B</td><td>12</td></tr>
<tr><td>7</td><td data-color='yellow'>R</td><td>14</td></tr>
<tr><td>8</td><td>A</td><td>16</td></tr>
<tr><td>9</td><td>V</td><td>18</td></tr>
<tr><td>10</td><td>O</td><td>20</td></tr>
</table>
</body>
</html>