Ajax 비동기 통신을 통해서 목록 데이터를 테이블 태그와 페이징 형식으로 표현하기 위해 플러그인 방식 구현

 

//사용법 예시
url = '/getPagingList.do';
option = {
		widthArray : [20,70,10],
		headerArray : ['순서','제목','날짜'],
		tdTemplte : [
						'<td>@{no}</td>',
						'<td>@{title}</td>',
						'<td>@{date}</td>',
					]
};
urlParams = {
	"pageSize":'10', 
	"pageNo":'1',    
	//나머지 조건값
};

$('#tableArea').tableMaker(option,url,urlParams, function ($this){
	//tr이벤트
	$this.find('tr').off().on('click',function(){
	});
});

1. URL : 비동기 통신을 위한 URL 정보

2. Option 

 - widthArray : 테이블의 넓이값을 %로 설정

 - headerArray : 테이블의 헤더명을 입력

 - tdTemplte

    + td의 클래스 및 화면에 표시될 내용을 설정

    + @{}는 형식 유지 필요

    + @{}안에 설정하는 값은 DB 컬럼값과 같은 명을 사용해야 함.

3. urlParams 

 - pageSize : 목록에 보여질 페이지 사이즈

 - pageNo : 페이지 번호

 

비동기 통신 결과값 예시

data.paging : {
    totalCnt : 3,
    pageNo : 1,
    pageSize : 10
}
data.result : [
    {no : 1, title : 'title1', date : '2020-01-01'},
    {no : 2, title : 'title2', date : '2020-01-01'},
    {no : 3, title : 'title3', date : '2020-01-01'},
]

*만약 결과를 하나의 Object로 작업을 해야 한다면, tableMaker에서 data.paging으로 되어있는 코드를 변경하여 사용

 

 

(function( $ ) {
	$.fn.tableMaker = function(option, url, urlParams, callBack) {
		
		var $this = $(this);
		
		var _this = {
				
			//비동기 통신
			ajaxCall : function(url, urlParams, callBackFunc){
				$.ajax({
					url: url,
					cache: false,
					data: urlParams,
					method: 'POST',
					dataType: 'json',
					contentType: 'application/json;charset=UTF-8',
					success: function(data, textStatus, jqXHR) {
						if(typeof callBackFunc == 'function') {
							callBackFunc(data);
						}
					},
					error: function(jqXHR, textStatus, errorThrown) {
						console.log(textStatus);
					}
				});
				
			},
		
			
			init : function(urlParams){
				//테이블 초기화
				$this.html('');
				
				_this.ajaxCall(url, urlParams, function(data) {
					
					if ( data.paging.totalCnt == 0 ){
						//검색 결과 없음.
						var html = '데이터가 존재하지 않습니다.';
                        $this.html(html);
					}else{
						//테이블 표기
						$this.html(_this.drawTable(data));
					}
					
					//페이징 이벤트 처리
					$this.find('div.paging ul li a').off().on('click',function(){
						var pagingData = $(this).attr('paging-data');
						var pageNo = 1;
						if ( pagingData ){
							pageNo = pagingData;
						}else{
							pageNo = $(this).text();
						}
						urlParams.pageNo = pageNo;
						_this.init(urlParams);
					});
					callBack($this,data);
				});
			},
		
			//페이징 HTML 생성
			drawPaging : function(data){
				var pagingHtml ='';
				
				var currentStartPage = Math.ceil(data.paging.pageNo/10)*10-9;
				var currentEndPage = currentStartPage + 9;
				var totalPageCnt   = Math.ceil(data.paging.totalCnt/data.paging.pageSize);
				
				if(currentEndPage > totalPageCnt ){
					currentEndPage = totalPageCnt;
				}
				
				pagingHtml += '<div class="paging">';
				pagingHtml += '    <ul>';
				
				if ( data.paging.pageNo > 1 ){
					pagingHtml += '        <li class="go_first"><a paging-data="1" href="javascript:;"><i class="fa fa-angle-double-left"></i></a></li>';
				}
				if ( data.paging.pageNo > 1 ){
					pagingHtml += '        <li class="go_prev"><a paging-data="'+(parseInt(data.paging.pageNo)-1)+'" href="javascript:;"><i class="fa fa-angle-left"></i></a></li>';
				}
				
				for ( var i = currentStartPage ; i <= currentEndPage ; i++){
					pagingHtml += '        <li ' 
					pagingHtml +=	( i == data.paging.pageNo ) ? 'class="on">' : '>'
					pagingHtml +=	'<a href="javascript:;">'+i+'</a></li>';
				}
				
				if( data.paging.pageNo < totalPageCnt){
					pagingHtml += '        <li class="go_next"><a paging-data="'+(parseInt(data.paging.pageNo)+1)+'" href="javascript:;"><i class="fa fa-angle-right"></i></a></li>';
				}
				
				
				if( currentEndPage < totalPageCnt){
					pagingHtml += '        <li class="go_last"><a paging-data="'+totalPageCnt+'" href="javascript:;"><i class="fa fa-angle-double-right"></i></a></li>';
				}
				pagingHtml += '    </ul>';
				pagingHtml += '</div>';
				return pagingHtml;
			},
		
			//table HTML 생성
			drawTable : function(data){
				var templteHtml ='';

				templteHtml += '        <table>' 
				
//				templteHtml += '<caption>';
//				templteHtml += data.paging.caption; 
//				templteHtml += '</caption>';
				
				templteHtml += '            <colgroup>';
				option.widthArray.forEach(function(value,index){
					templteHtml += '                <col width="'+value+'%;">';
				});
				templteHtml += '            </colgroup>';
				templteHtml += '            <thead>';
				option.headerArray.forEach(function(value,index){
					templteHtml += '                <th>'+value+'</th>';
				});
				templteHtml += '            </thead>';
				templteHtml += '            <tbody>';
				
				data.result.forEach(function(rsValue,rsIndex){
					templteHtml += '                <tr>';
					option.tdTemplte.forEach(function(value,index){
						var check = false;
						do{
							var match = value.match(/\@\{(.+?)\}/);
							if ( match && match.length >= 2 ){
								var dat = '';
								if ( rsValue[match[1]] ){
									dat = rsValue[match[1]];
								}
								value = value.replace(/\@\{(.+?)\}/, dat);
								check = true;
							}else{
								check = false;
							}
						}while(check);
						
						templteHtml += value;
					});
					templteHtml += '                </tr>';
				});

				templteHtml += '            </tbody>';
				templteHtml += '        </table>';
				templteHtml += _this.drawPaging(data);
				return templteHtml;
			}
		};
		
		_this.init(urlParams);
		
	}
}( jQuery ));