Development/jQuery

jquery ajax pagination 예제

linuxism 2012. 6. 16. 23:59


jquery를 이용한 ajax 테이블 페이징

테이블에 여러자료가 있고 그것이 아주많다면 한페이지에 다루기 힘들것이다. 따라서 일부분만보여주고 페이지로 나누어 보여주려고 한다.

여전히 네이버 베스트셀러리스트를 참조했다. 소스가기니 접어두었다.아래 참조

접기

001.<table class="sortable paginated">
002.<caption>베스트셀러</caption>
003.<thead>
004.<tr>
005.<th></th>
006.<th class="sorting">순위</th>
007.<th class="sorting">책제목</th>
008.<th class="sorting">저자</th>
009.<th class="sort-date">출판사</th>
010.<th class="sorting">가격</th>
011.</tr>
012.</thead>
013.<tbody>
014.<tr>
016.<td>1</td>
017.<td>덕혜옹주</td>
018.<td>권비영</td>
019.<td>다산책방</td>
020.<td>11,800원</td>
021.</tr>
022.<tr>
024.<td>2</td>
025.<td>삼성을 생각한다</td>
026.<td>김용철</td>
027.<td>사회평론</td>
028.<td>22,000원</td>
029.</tr>
030.<tr>
032.<td>3</td>
033.<td>죽을 때 후회하는 스물다섯 가지</td>
034.<td>오츠 슈이치</td>
035.<td>21세기북스</td>
036.<td>12,000원</td>
037.</tr>
038.<tr>
040.<td>4</td>
041.<td>시크릿 두 번째 이야기</td>
042.<td>폴 해링턴</td>
043.<td>살림</td>
044.<td>12,000원</td>
045.</tr>
046.<tr>
048.<td>5</td>
049.<td>1Q84</td>
050.<td>무라카미 하루키</td>
051.<td>문학동네</td>
052.<td>14,800원</td>
053.</tr>
054.<tr>
056.<td>6</td>
057.<td>마법의 돈관리</td>
058.<td>고득영</td>
059.<td>국일미디어</td>
060.<td>12,000원</td>
061.</tr>
062.<tr>
064.<td>7</td>
065.<td>박철범의 하루공부법</td>
066.<td>박철범</td>
067.<td>다산에듀</td>
068.<td>12,000원</td>
069.</tr>
070.<tr>
072.<td>8</td>
073.<td>엄마를 부탁해</td>
074.<td>신경숙</td>
075.<td>창비</td>
076.<td>10,000원</td>
077.</tr>
078.<tr>
080.<td>9</td>
081.<td>아이의 사생활</td>
082.<td>EBS</td>
083.<td>지식채널</td>
084.<td>16,800원</td>
085.</tr>
086.<tr>
088.<td>10</td>
089.<td>그건, 사랑이였네</td>
090.<td>한비야</td>
091.<td>푸른숲</td>
092.<td>12,000원</td>
093.</tr>
094.<tr>
096.<td>11</td>
097.<td>김연아의 7분 드라마</td>
098.<td>김연아</td>
099.<td>중아출판사</td>
100.<td>15,000원</td>
101.</tr>
102. 
103.<tr>
105.<td>12</td>
106.<td>아버지의 눈물</td>
107.<td>김정현</td>
108.<td>문이당</td>
109.<td>11,000원</td>
110.</tr>
111.<tr>
113.<td>13</td>
114.<td>쓸만한 아이</td>
115.<td>이금이</td>
116.<td>푸른책들</td>
117.<td>8,800원</td>
118.</tr>
119.<tr>
121.<td>14</td>
122.<td>일본전산이야기</td>
123.<td>감성호</td>
124.<td>쌤앤파커스</td>
125.<td>14,500원</td>
126.</tr>
127. 
128.</tbody>
129.</table>

접기

아래와 같은 순서로 해볼것이다.

  • 보여줄 페이지설정
  • 전체 페이지계산
  • 스크립트로 페이지버튼html 소스짜기

보여줄 페이지 설정

한페이지당 우리는 표에서 5개를 봉줄것이다. 따라서 다음과 같이 정한다.

01.$('table.paginated').each(function() {
02.var currentPage = 0;
03.var numPerPage = 5;
04.var $table = $(this);
05.var repaginate = function() {
06.$table.find('tbody tr').hide()
07.//기본적으로 모두 감춘다
08..slice(currentPage * numPerPage,
09.(currentPage + 1) * numPerPage)
10..show();
11.//현재페이지+1 곱하기 현재페이지까지 보여준다
12.};   

currentPage로 초기값을 0으로주었다.그리고 numPerPage로 기본값을 5로주고 그아래는 계산하고.slice()메소드를 이용해 필요한 만큼 보여주도록 되어있다.

페이지계산 하기

표가 여러개있고 그중 우리는 5개식 보여주기로 했다. 전체표의 열을 5로나누었을때 소수가 되면 페이지계산이안되니 반올림해서 페이지를 늘이도록하자.

1.var numRows = $table.find('tbody tr').length;
2.//length로 전체길이구함
3.var numPages = Math.ceil(numRows / numPerPage);
4.//Math.ceil를 이용하여 반올림

위와 같이 한다면 기본소스에서 14열을 사용했으니 반올림하여 14/5 = 3. 따라서 3개의 페이지가 만들어질 것이다.

페이지버튼 html 소스짜기

마지막으로 해 줄 것은 페이지버튼을 만들어주는것이다. 페이지가 늘어남에따라 이버튼역시 늘어나니 스크립트로 만들어줘야한다.

01. 
02.var $pager = $('<div class="pager">
03.</div>
04.');
05.//pager라는 클래스의 div엘리먼트 작성
06.for (var page = 0; page < numPages; page++) {
07.$('<span class="page-number"></span>').text(page + 1)
08..bind('click', {newPage: page}, function(event) {        
09.currentPage = event.data['newPage'];
10.repaginate();
11.//for구문을 이용하여 페이지 수만큼
12.//버튼을 구현
13.$(this).addClass('active')
14.//활성화된페이지에는 active라는 클래스명을 붙여준다.
15..siblings().removeClass('active');
16.}).appendTo($pager).addClass('clickable');
17.}  
18.$pager.insertBefore($table)
19.//앞서 설정한 페이지키를 삽입
20..find('span.page-number:first').addClass('active');
21.});

위에서 이벤트가 .click으로 바로 가지않고 .bind로 설정된것은 변수들이 함수밖에 정의되있는것을 참조하기 때문이다. 그냥.click으로 처리한다면 빈페이지가뜰것이다. 이로서 완성되었다.3개의 페이지버튼이나오것이고 한페이지에 5열이 나올 것이다.

다시 둘러보기

이 함수가 정열과 함께 사용되려면 정열이될때마다 페이징이 실행되도록 하면된다.이때 역시 외부에서 참조 하도록 .bind를 쓴다. 최종 코드를보자

01. 
02.$(document).ready(function() {
03.$('table.paginated').each(function() {
04.var currentPage = 0;
05.var numPerPage = 5;
06.var $table = $(this);   
07. 
08.$table.bind('repaginate'function() {
09.$table.find('tbody tr').hide()
10..slice(currentPage * numPerPage,
11.(currentPage + 1) * numPerPage)
12..show();});
13. 
14.var numRows = $table.find('tbody tr').length;
15.var numPages = Math.ceil(numRows / numPerPage);
16.var $pager = $('<div class="pager">
17.</div>
18.');
19.for (var page = 0; page < numPages; page++) {
20.$('<span class="page-number"></span>').text(page + 1)
21..bind('click', {newPage: page}, function(event) {
22.currentPage = event.data['newPage'];
23.$table.trigger('repaginate');
24.$(this).addClass('active')
25..siblings().removeClass('active');
26.}).appendTo($pager).addClass('clickable');}
27.$pager.insertBefore($table)
28..find('span.page-number:first').addClass('active');});}); 

마지막으로 호출하기위해 앞쪽의 정렬키뒤에 $table.trigger('repaginate'); 를 추가 해준다

01..
02...
03....
04.$table.find('th').removeClass('sorted-asc')
05..removeClass('sorted-desc');
06.if (sortDirection == 1) {
07.$header.addClass('sorted-asc');
08.}
09.else {
10.$header.addClass('sorted-desc');
11.}
12.$table.alternateRowColors();
13. 
14.$table.trigger('repaginate');     });

예제를 보려면 여기로http://sianasiatiger.cafe24.com/study/T_usePage.html



출처 - http://siana.tistory.com/entry/ajax-%ED%85%8C%EC%9D%B4%EB%B8%94-%ED%8E%98%EC%9D%B4%EC%A7%95