Programing/JavaScript

자바스크립트 스크롤 내려서 추가 조회 하는 방법, 스크롤 이벤트

리커니 2016. 1. 14.
반응형

 

자바스크립트 스크롤 내려서 추가 조회 하는 방법, 스크롤 이벤트

 

보통 조회하는 데이터의 갯수가 많아 불러오는데 시간이 많이 걸린다면

페이징 처리를 해 원하는 갯수만큼만 조회하는 방식으로 시간을 단축한다.

 

이 방식 외에 원하는 갯수만큼 데이터를 뿌려준 후, 스크롤이 최하단으로 내려갈 때

기존 갯수만큼의 새로운 데이터를 가져와 하단에 붙이는 방식도 있다.

 

이번 포스팅에서는 후자의 방식을 구현해 보려 한다.

페이징처리 방식에 질려 급작스럽게 구현하느라 소스가 이상 할 수도 있다.

하지만 구현되는건 확인했으니 걱정은 말자.

 

-HTML

<div>
  <ul id="list" class="stList">
  
    </ul>

</div>

 

- JAVASCRIPT 소스

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
<script type="text/javascript">
var page = 1;  //페이징과 같은 방식이라고 생각하면 된다. 
 
$(function(){  //페이지가 로드되면 데이터를 가져오고 page를 증가시킨다.
     getList(page);
     page++;
}); 
 
$(window).scroll(function(){   //스크롤이 최하단 으로 내려가면 리스트를 조회하고 page를 증가시킨다.
     if($(window).scrollTop() >= $(document).height() - $(window).height()){
          getList(page);
           page++;   
     } 
});
 
function getList(page){
 
    $.ajax({
        type : 'POST',  
        dataType : 'json'
        data : {"page" : page},
        url : '주소'
        success : function(returnData) {
            var data = returnData.rows;
            var html = "";
            if (page==1){ //페이지가 1일경우에만 id가 list인 html을 비운다.
                  $("#list").html(""); 
            }
            if (returnData.startNum<=returnData.totCnt){
                if(data.length>0){
                // for문을 돌면서 행을 그린다.
                }else{
                //데이터가 없을경우
                }
            }
            html = html.replace(/%20/gi, " ");
            if (page==1){  //페이지가 1이 아닐경우 데이터를 붙힌다.
                $("#list").html(html); 
            }else{
                $("#busStopList").append(html);
            }
       },error:function(e){
           if(e.status==300){
               alert("데이터를 가져오는데 실패하였습니다.");
           };
       }
    }); 
}
cs

 

 

- JAVA CONTROLLER 소스

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
@RequestMapping(value="주소", produces="text/plain;charset=UTF-8")
@ResponseBody   //없으면 AJAX 통신 안되요
public String getList(SearchVO param, HttpServletRequest request, HttpServletResponse response, ModelMap model) {
    Gson gson = new Gson();
    DataSet set = new DataSet();
    try {
        int totalCnt = service.getListCnt(param);  //데이터의 전체 갯수를 가져온다.
        int page = param.getPage();  //파라메터 page값을 받는다.
        if (page==1){
            param.setStartNum(1);
            param.setEndNum(20);  //데이터를 20개씩 가져오겠다.
        }else{
            param.setStartNum(page+(19*(page-1)));  //10개씩 가져오고싶다면 19->9로 
            param.setEndNum(page*20);   //20, 40, 60
        }
        //위에서 구한, 데이터를 가져올 시작 rownum과 끝 rownum을 값을 같이 보낸다. 이 사이의 데이터를 조회
        List<DataVO> list = service.getList(param);  //조회한 데이터를 가져온다.
 
        set.setRows(list);
        set.setTotCnt(totalCnt);
        set.setStartNum(param.getStartNum());
        set.setResultCode(200);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return gson.toJson(set);
}
cs

 

쿼리문은 아래의 Link를 참조한다.

Link : 오라클 부분 조회, 페이징 처리, ROW_NUMBER(), ROWNUM, 원하는 행 조회

 

rnum이 startNum과 endNum 사이의 행의 값을 조회해 온다.

 

이러면 클릭하는 수고(?!) 없이 스크롤을 내리기만 하면 데이터를 조회해 확인 할 수 있다.

 

반응형

댓글

💲 추천 글