通用分頁-基于bootstrap和jQuery

效果圖

pagination1.png
pagination2.png

需求場景

做公司后臺(tái)項(xiàng)目,后臺(tái)返回?cái)?shù)據(jù)展示在頁面展示,數(shù)據(jù)量很大,所以要采用分頁,點(diǎn)擊不同頁碼,ajax post當(dāng)前頁碼以及其它必要信息給后臺(tái),返回該頁碼對(duì)應(yīng)的數(shù)據(jù)再動(dòng)態(tài)展示到頁面,實(shí)現(xiàn)分頁局部刷新。

思路

用一個(gè)div作為容器,通過配置該div的屬性用js來動(dòng)態(tài)生成需要的分頁。在需要用到分頁的地方,只需要寫這樣一個(gè)div標(biāo)簽就OK了。像這樣:

<div class="test" pagination="p-new" pagenumber="5" totalnumber="15" paginationmax="10"></div>

配置的屬性包括:分頁的總頁數(shù)、分頁顯示的頁數(shù)、當(dāng)前所在頁碼。分頁所需要的html元素
用js動(dòng)態(tài)生成,樣式則采用bootstrap提供的分頁的基礎(chǔ)樣式。bootstrap提供的分頁的基礎(chǔ)樣式代碼可以生成一個(gè)靜態(tài)的分頁:

<ul class="pagination">
    <li><a href="#">?</a></li>
    <li><a href="#">1</a></li>
    <li><a href="#">2</a></li>
    <li class="active"><a href="#">3</a></li>
    <li class="disabled"><a href="#">?</a></li>
</ul>

具體實(shí)現(xiàn)

cdn引入jQuery和bootstrap

    <link rel="stylesheet" >
    <script src="http://cdn.bootcss.com/jquery/1.11.1/jquery.min.js"></script>
    <script src="http://cdn.bootcss.com/bootstrap/3.3.0/js/bootstrap.min.js"></script>

注意,jQuery一定要在bootstrap之前引入,因?yàn)閎ootstrap所有的js插件都依賴bootstrap

定義3個(gè)配置項(xiàng)變量。定義動(dòng)態(tài)生成分頁html結(jié)構(gòu)的函數(shù)initPagination,參數(shù)傳入一個(gè)dom對(duì)象,表示分頁的容器。

//當(dāng)前頁數(shù)
        var pagenumber;
        //總頁數(shù)
        var totalnumber;
        //分頁欄顯示的頁數(shù)
        var paginationmax;
        paginationInit();
        function initPagination(element){
            pagenumber = Number(element.attr('pagenumber'));
            totalnumber = Number(element.attr('totalnumber'));
            paginationmax = Number(element.attr('paginationmax'));
            if(totalnumber >= 1 && pagenumber <= totalnumber && paginationmax <= totalnumber){
                var content =
                    "<ul class='pagination'>" +
                        "<li value='pre'>" +
                            "<a href='javascript:void(0);'>?</a>" +
                        "</li>";
                for (var i = 0; i < totalnumber; i++) {
                    content +=
                        "<li value='"+ (i + 1) +"'>" +
                            "<a href='javascript:void(0);'>" + (i + 1) +
                            "</a>" +
                        "</li>"
                }
                content +=
                        "<li value='next'>" +
                            "<a href='javascript:void(0);'>?</a>" +
                        "</li>" +
                    "</ul>";
                element.append(content);
//                為設(shè)置為當(dāng)前頁的頁簽添加樣式
                element.children('ul').children('li[value = '+ pagenumber +']').addClass('active');
                element.children('ul').children('li').click(clickChange);
                element.children('ul').children('li').click(processData);
//                顯示那幾個(gè)頁簽 傳入任意li元素即可
                pageShow(element.children('ul').children('li[value = '+ pagenumber +']'))
            }else{
                console.log('分頁自定義屬性不合理')
            }
        };

寫一個(gè)函數(shù)用來調(diào)用上面的initPagination函數(shù),不直接調(diào)用pagination時(shí)因?yàn)橛锌赡芤粋€(gè)頁面需要多個(gè)分頁。

//        凡是帶有pagination = p-new屬性的元素,都會(huì)生成分頁,這樣設(shè)計(jì)方便一個(gè)頁面中有多個(gè)不同的分頁
        function paginationInit(){
            $('[pagination = p-new]').each(function(){
                initPagination($(this))
            })
        };

點(diǎn)擊不同頁簽時(shí)候的樣式變化。有兩種情況:如果點(diǎn)擊的是普通頁簽,此時(shí)點(diǎn)擊誰就給誰對(duì)應(yīng)的li添加.active樣式。如果點(diǎn)擊的是首位的上一頁和下一頁,那么就
需要給當(dāng)前有.active的li元素的前一個(gè)或者后一個(gè)li添加.active樣式。

//        點(diǎn)擊頁簽時(shí)候樣式的變化
        function clickChange(ev){
            ev = event || window.event;
            pageShow($(ev.target).parent());

            $(ev.target).parent().parent().children('li').each(function(index,item){
                if($(item).hasClass('active')){
                    $(item).removeClass('active');
                }
            });
//                點(diǎn)擊頁碼頁簽
            if($(ev.target).parent().attr('value') != 'pre' && $(ev.target).parent().attr('value') != 'next'){
                pagenumber = Number($(ev.target).parent().attr('value'))
                $(ev.target).parent().addClass('active');
                $(ev.target).parent().parent().children('li[value = pre]').removeClass('disabled');
                $(ev.target).parent().parent().children('li[value = next]').removeClass('disabled');
//                點(diǎn)擊上一頁頁簽
            }else if($(ev.target).parent().attr('value') == 'pre'){
                pagenumber -= 1;
                if(pagenumber <= 1){
                    pagenumber = 1;
                    $(ev.target).parent().parent().children('li[value = 1]').addClass('active');
                    $(ev.target).parent().parent().children('li[value = pre]').addClass('disabled');
                }else{
                    $(ev.target).parent().parent().children('li[value = '+ pagenumber.toString() +']').addClass('active');
                    $(ev.target).parent().parent().children('li[value = pre]').removeClass('disabled');
                    $(ev.target).parent().parent().children('li[value = next]').removeClass('disabled');
                }
//                點(diǎn)擊下一頁頁簽
            }else if($(ev.target).parent().attr('value') == 'next'){
                pagenumber += 1;
                if(pagenumber >= totalnumber){
                    pagenumber = totalnumber;
                    $(ev.target).parent().parent().children('li[value = '+ totalnumber +']').addClass('active');
                    $(ev.target).parent().parent().children('li[value = next]').addClass('disabled');
                }else{
                    $(ev.target).parent().parent().children('li[value = '+ pagenumber.toString() +']').addClass('active');
                    $(ev.target).parent().parent().children('li[value = next]').removeClass('disabled');
                    $(ev.target).parent().parent().children('li[value = pre]').removeClass('disabled');
                }
            }
        }

接下來這個(gè)有點(diǎn)意思。展示哪些頁碼。比如總共100頁數(shù)據(jù),我們的分頁欄始終顯示10頁,那么這10頁就需要?jiǎng)討B(tài)的根據(jù)當(dāng)前頁、總頁數(shù)而變化。我是找了一個(gè)其他的分頁點(diǎn)了點(diǎn)去找第幾頁的時(shí)候顯示哪些頁碼這個(gè)規(guī)律的。
代碼看起來有點(diǎn)亂,不過自己找個(gè)其他網(wǎng)站的分頁點(diǎn)幾下就知道怎么寫了。

//       展示哪些頁碼 要用一個(gè)實(shí)際的分頁找規(guī)律
        function pageShow(element){
            if(Number(pagenumber) >= 1 && Number(pagenumber) <= parseInt(.5 * Number(paginationmax))){
                element.parent().children('li').each(function(index,item){
                    if(Number($(item).attr('value')) >= 1 + Number(paginationmax) && Number($(item).attr('value')) <= Number(totalnumber)){
                        $(item).css('display','none')
                    }else{
                        $(item).css('display','inline-block')
                    }
                });
            }else if(Number(pagenumber) > parseInt(.5 * Number(paginationmax)) && Number(pagenumber) <= Number(totalnumber) - parseInt(.5 * Number(paginationmax))){
                element.parent().children('li').each(function(index,item){
                    if((Number($(item).attr('value')) >= 1 && Number($(item).attr('value')) <= Number(pagenumber) - parseInt(.5 * Number(paginationmax))) || (Number($(item).attr('value')) > Number(pagenumber) + parseInt(.5 * Number(paginationmax)) && Number($(item).attr('value')) <= Number(totalnumber))){
                        $(item).css('display','none')
                    }else{
                        $(item).css('display','inline-block')
                    }
                });
            }else if(Number(pagenumber) > Number(totalnumber) - parseInt(.5 * Number(paginationmax))){
                element.parent().children('li').each(function(index,item){
                    if(Number($(item).attr('value')) >= 1 && Number($(item).attr('value')) <= Number(totalnumber) - Number(paginationmax)){
                        $(item).css('display','none')
                    }else{
                        $(item).css('display','inline-block')
                    }
                });
            }
        }

我給每個(gè)li頁簽綁定了一個(gè)專門用來處理ajax的點(diǎn)擊事件,當(dāng)前所在的頁碼在全局可以獲取到。可以處理切換頁簽時(shí)候發(fā)送ajax,根據(jù)不同頁碼返回不同數(shù)據(jù)。

//       頁面切換時(shí)候的處理函數(shù)。比如發(fā)ajax根據(jù)不同頁碼獲取不同數(shù)據(jù)展示數(shù)據(jù)等,用戶自行配置。
        function processData(){
            console.log('當(dāng)前頁碼',pagenumber);
//            用戶在這里寫頁碼切換時(shí)候的邏輯
        }

一個(gè)簡單的通用分頁就完成了,引入js后只需要寫一個(gè)可配置屬性的div標(biāo)簽就可以實(shí)現(xiàn)bootstrap風(fēng)格的動(dòng)態(tài)分頁。還有很多地方需要完善,比如目前變量還聲明在全局等等,時(shí)間原因就先到此為止啦。
完整代碼我上傳到了github。https://github.com/yanhaoqi/pagination-bootstorp.git

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容