MUI 프레임워크를 활용한 무한 스크롤 페이징 구현

MUI의 pullRefresh 컴포넌트를 활용하면 모바일 웹 앱에서 상단 당기기 새로고침과 하단 끝까지 스크롤 시 추가 데이터를 로드하는 무한 스크롤 기능을 구현할 수 있다. 이 글에서는 하단 스크롤 시 서버에서 페이지 단위로 데이터를 가져와 화면에 렌더링하는 방법을 다룬다.

1. 필수 리소스 로드

MUI의 CSS와 JavaScript 파일, 그리고 데이터 조작을 위한 jQuery를 문서에 포함시킨다.

<link rel="stylesheet" href="static/css/mui.css" />
<script src="static/js/jquery-3.2.0.js"></script>
<script src="static/js/mui.min.js"></script>

2. 스크롤 컨테이너 마크업

pullRefresh가 동작하려면 mui-scroll-wrappermui-scroll 클래스를 가진 중첩 구조가 필요하다. 내부에 리스트를 동적으로 채워 넣을 영역을 배치한다.

<div id="refreshContainer" class="mui-content mui-scroll-wrapper">
    <div class="mui-scroll">
        <ul class="item-list" id="dataList"></ul>
    </div>
</div>

3. 데이터 요청 및 무한 스크롤 초기화

즉시 실행 함수 내에서 페이지 번호를 관리하고, AJAX로 서버에 페이지별 데이터를 요청한다. 응답받은 데이터를 HTML 문자열로 조합하여 리스트에 추가 렌더링한다.

(function() {
    var totalPage = 0;
    var pageNum = 1;

    function fetchPageData() {
        var markup = "";
        $.ajax({
            url: "http://www.example.com/api/orders/list?page=" + pageNum,
            type: "GET",
            dataType: "json",
            timeout: 10000,
            success: function(response) {
                totalPage = response.data.last_page;
                var items = response.data.data;

                $.each(items, function(idx, item) {
                    markup += '<li class="list-row" data-href="/detail?id=' + item.id + '">'
                        + '<div class="row-header">'
                        +     '<span class="order-id">No. ' + item.order_no + '</span>'
                        +     '<span class="order-time">' + item.created_at + '</span>'
                        + '</div>'
                        + '<div class="row-body">'
                        +     '<div class="thumb-box"><img src="' + item.image_url + '" /></div>'
                        +     '<div class="info-box">'
                        +         '<p class="info-title">' + item.goods_name + '</p>'
                        +         '<p class="info-sub">' + item.machine_name + ' (' + item.machine_no + ')</p>'
                        +         '<p class="info-status">상태: <em class="status-active">' + item.order_status + '</em></p>'
                        +     '</div>'
                        +     '<div class="price-box">' + item.amount + '원</div>'
                        + '</div>'
                        + '</li>';
                });

                $("#dataList").append(markup);
            },
            error: function() {
                console.log("데이터 요청 실패");
            }
        });
    }

    mui.init({
        pullRefresh: {
            container: "#refreshContainer",
            up: {
                height: 50,
                auto: true,
                contentrefresh: "불러오는 중...",
                contentnomore: "더 이상 데이터가 없습니다",
                callback: onPullUp
            }
        }
    });

    function onPullUp() {
        setTimeout(function() {
            fetchPageData();
            pageNum++;
            mui("#refreshContainer").pullRefresh().endPullupToRefresh(pageNum > totalPage);
        }, 1500);
    }
})();

4. 탭 이벤트 처리

MUI의 pullRefresh 환경에서는 일반적인 onclick이나 <a> 태그의 기본 동작이 차단될 수 있다. 따라서 MUI에서 제공하는 tap 이벤트를 위임 방식으로 바인딩하여 페이지 이동을 처리해야 한다.

$(function() {
    $("#refreshContainer").on("tap", ".list-row", function(e) {
        var targetUrl = $(this).attr("data-href");
        if (targetUrl) {
            window.location.href = targetUrl;
        }
    });
});

각 리스트 행에 data-href 속성으로 이동할 경로를 저장해두면, tap 이벤트 발생 시 해당 값을 읽어 원하는 상세 페이지로 이동할 수 있다.

태그: MUI pullRefresh 무한스크롤 AJAX 페이징 jQuery

9월 8일 09:58에 게시됨