1. 程式人生 > >jquery外掛--分頁器

jquery外掛--分頁器

1. 分頁器效果:


2.js程式碼

//定義分頁器
(function($){
    $.fn.extend({
        cxPagination: function (options) {
            var obj = this;
            if (!options) {
                console.error("pagination options is undefined!");
                return false;
            }
            if (options['totalCount'] == undefined ) {
                console.error(" totalCount in pagination options is undefined!");
                return false;
            }
            var defaults = {
                currentNumber: 1,
                pageSize: 15,
                pageSizeArr: [10, 15, 20],
                onSelectPage:function(pageNumber,pageSize){
                    console.log("onSelectPage pageNumber: ");
                    console.log(pageNumber);
                    console.log("pageSize: ");
                    console.log(pageSize);
                },
                onChangePageSize:function(pageNumber,pageSize){
                    console.log("onChangePageSize pageNumber: ");
                    console.log(pageNumber);
                    console.log("pageSize: ");
                    console.log(pageSize);
                },
            };
            var settings = $.extend(defaults, options);

            var onSelectPage = settings.onSelectPage;
            var onChangePageSize = settings.onChangePageSize;
            var pageSize = settings.pageSize;
            var pageSizeArr = settings.pageSizeArr;
            var totalCount = settings['totalCount'];
            var currentNumber = settings['currentNumber'];
            var totalPageNumber = parseInt(totalCount/pageSize);
            if(totalCount%pageSize > 0){
                totalPageNumber += 1;
            }
            if(totalCount <= 0){
                $(this).html("");
                return;
            }
            if(currentNumber <= 0 ){
               currentNumber = 1;
            }
            if(currentNumber > totalPageNumber){
                currentNumber = totalPageNumber;
            }

            var startNumber = currentNumber - 2;
            var endNumber = currentNumber + 2;
            var isFirstPage = (currentNumber == 1);
            var isLastPage = (currentNumber == totalPageNumber);

            var paginationHtml = '<nav aria-label="Page navigation" style="float:right;font-size:13px;">';
            paginationHtml += '<ul class="pagination">';
            paginationHtml += '<li><span style="margin-right:5px;border:0;">共<span>' + totalPageNumber + "</span>頁/" + totalCount + "條</span></li>";
            if (isFirstPage) {
                paginationHtml += '<li>'
                    + '<span aria-hidden="true">«</span></li>';
            } else {
                paginationHtml += '<li><a href="javascript:void(0);" aria-label="Previous">'
                    + '<span aria-hidden="true">«</span>'
                    + '</a></li>';
            }
            if (totalPageNumber > 0 && totalPageNumber <= 7) {
                for (var i = 1; i <= totalPageNumber; i++) {
                    if(i == currentNumber){
                        paginationHtml += '<li class="active"><a href = "javascript:void(0);">' + i + '</a></li>';
                    }else {
                        paginationHtml += '<li><a href = "javascript:void(0);">' + i + '</a></li>';
                    }
                }
            } else if (totalPageNumber > 7) {
                if (currentNumber <= 5) {
                    for (var i = 1; i <= 7; i++) {
                        if(i == currentNumber){
                            paginationHtml += '<li class="active"><a href = "javascript:void(0);">' + i + '</a></li>';
                        }else {
                            paginationHtml += '<li><a href = "javascript:void(0);">' + i + '</a></li>';
                        }
                    }
                    paginationHtml += '<li><a href="javascript:void(0);">...</a></li>';
                } else if (currentNumber > 5 && currentNumber < totalPageNumber - 3) {
                    paginationHtml += '<li><a href="javascript:void(0);">1</a></li>'
                        + '<li><a href="javascript:void(0);">2</a></li>'
                        + '<li><a href="javascript:void(0);">...</a></li>';
                    for (var i = startNumber; i <= endNumber; i++) {
                        if(i == currentNumber){
                            paginationHtml += '<li class="active"><a href = "javascript:void(0);">' + i + '</a></li>';
                        }else {
                            paginationHtml += '<li><a href = "javascript:void(0);">' + i + '</a></li>';
                        }
                    }
                    paginationHtml += '<li><a href="javascript:void(0);">...</a></li>';
                } else if (currentNumber >= totalPageNumber - 3 && currentNumber <= totalPageNumber) {
                    paginationHtml += '<li><a href="javascript:void(0);">1</a></li>'
                        + '<li><a href="javascript:void(0);">2</a></li>'
                        + '<li><a href="javascript:void(0);">...</a></li>';
                    for (var i = startNumber; i <= totalPageNumber; i++) {
                        if(i == currentNumber){
                            paginationHtml += '<li class="active"><a href = "javascript:void(0);">' + i + '</a></li>';
                        }else {
                            paginationHtml += '<li><a href = "javascript:void(0);">' + i + '</a></li>';
                        }
                    }
                }
            }

            if (isLastPage) {
                paginationHtml += '<li>'
                    + '<span aria-hidden="true">»</span></li>';
            } else {
                paginationHtml += '<li><a href="javascript:void(0);" aria-label="Next">'
                    + '<span aria-hidden="true">»</span>'
                    + '</a></li>';
            }

            paginationHtml += '<li><select style="margin-left:5px;border: 1px solid #ddd;padding: 6px 12px;'
               + 'border-radius: 4px;float:left;">';
            $.each(pageSizeArr, function(index, ele){
                if(ele == pageSize){
                    paginationHtml += '<option selected value="' + ele + '">' + ele + '條/頁</option>';
                }else {
                    paginationHtml += '<option value="' + ele + '">' + ele + '條/頁</option>';
                }
            });

            paginationHtml += '</select></li>';

            paginationHtml += '<li style="margin-left:10px;">跳至<input style="width: 40px;text-align: center;border-radius: 4px;border: 1px solid #ddd;'
                           + 'margin: 0px 5px;line-height:24px;" id="pageNumberInput" value="' + currentNumber + '"/>頁 '
                           + '<button class="btn btn-default" style="padding: 4px 8px;font-size: 13px;margin-left: 5px;">確定</button></li>';

            paginationHtml += '</ul></nav>';

            $(this).html(paginationHtml);

            $(this).find("li").on('click',function(){
                 var linkArr = $(this).find("a");
                 if(linkArr && linkArr.length > 0){
                     var linkText = linkArr[0].innerText;
                     //點選的是頁碼時
                     if(notNegativeIntegerNumber(linkText)){//點選的是頁數
                         //$(".pagination").find("li").removeClass("active");
                         //$(this).addClass("active");
                         currentNumber=linkText;
                         //頁碼 頁大小改變時 重新載入渲染分頁器
                         obj.cxPagination({
                             totalCount:totalCount,
                             currentNumber:currentNumber,
                             pageSize:pageSize
                         });

                         onSelectPage(currentNumber, pageSize);
                     }else{
                         var ariaLabel = linkArr[0].getAttribute("aria-label");
                         console.log("ariaLabel: " + ariaLabel);
                         //點選的是上一頁或下一頁按鈕時
                         if(ariaLabel) {
                             if (ariaLabel == "Previous") {
                                 currentNumber = currentNumber - 1;
                                 //onSelectPage(currentNumber, pageSize);
                             } else if (ariaLabel == "Next") {
                                 currentNumber = currentNumber + 1;
                                 //onSelectPage(currentNumber, pageSize);
                             }
                             //頁碼 頁大小改變時 重新載入渲染分頁器
                             obj.cxPagination({
                                 totalCount: totalCount,
                                 currentNumber: currentNumber,
                                 pageSize: pageSize
                             });
                             onSelectPage(currentNumber, pageSize);
                         }
                     }
                 }
            });

            //pageSize change事件
            $(this).find("li>select").on('change',function(e){
                var newPageSize = e.target.value;
                console.log("newPageSize: " + newPageSize);
                pageSize = newPageSize;
                //重新計算頁數
                totalPageNumber = parseInt(totalCount/pageSize);
                if(totalCount%pageSize > 0){
                    totalPageNumber += 1;
                }
                //$("#totalPageNumber").html(totalPageNumber);
                if(currentNumber > totalPageNumber){
                    currentNumber = totalPageNumber ;
                }

                //頁碼 頁大小改變時 重新載入渲染分頁器
                obj.cxPagination({
                    totalCount:totalCount,
                    currentNumber:currentNumber,
                    pageSize:pageSize
                });
                onChangePageSize(currentNumber,newPageSize);

            });

            //跳轉頁面點選事件
            $(this).find("li>button").on('click',function(e){
                var newPageNumber = $("#pageNumberInput").val();
                console.log("newPageNumber: " + newPageNumber);

                if(newPageNumber == "" || newPageNumber == currentNumber){
                    return false;
                }
                if(newPageNumber > totalPageNumber){
                    newPageNumber = totalPageNumber;
                }
                currentNumber = newPageNumber;
                //頁碼改變時 重新載入渲染分頁器
                obj.cxPagination({
                    totalCount:totalCount,
                    currentNumber:currentNumber,
                    pageSize:pageSize
                });
                onSelectPage(currentNumber, pageSize);

            });

        }
    });

}(jQuery));

3. HTML程式碼 以及 呼叫程式碼

## 分頁器
<div id="pp">

</div>
$(document).ready(function(){
   //分頁器
   $("#pp").cxPagination({
       totalCount:100,
       currentNumber:5,
       pageSize:15
   });
});