通用分页-基于bootstrap和jQuery

效果图

pagination1.png
pagination2.png

需求场景

做公司后台项目,后台返回数据展示在页面展示,数据量很大,所以要采用分页,点击不同页码,ajax post当前页码以及其它必要信息给后台,返回该页码对应的数据再动态展示到页面,实现分页局部刷新。

思路

用一个div作为容器,通过配置该div的属性用js来动态生成需要的分页。在需要用到分页的地方,只需要写这样一个div标签就OK了。像这样:

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

配置的属性包括:分页的总页数、分页显示的页数、当前所在页码。分页所需要的html元素
用js动态生成,样式则采用bootstrap提供的分页的基础样式。bootstrap提供的分页的基础样式代码可以生成一个静态的分页:

<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>

具体实现

cdn引入jQuery和bootstrap

    <link rel="stylesheet" href="http://cdn.bootcss.com/bootstrap/3.3.0/css/bootstrap.min.css">
    <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之前引入,因为bootstrap所有的js插件都依赖bootstrap

定义3个配置项变量。定义动态生成分页html结构的函数initPagination,参数传入一个dom对象,表示分页的容器。

//当前页数
        var pagenumber;
        //总页数
        var totalnumber;
        //分页栏显示的页数
        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);
//                为设置为当前页的页签添加样式
                element.children('ul').children('li[value = '+ pagenumber +']').addClass('active');
                element.children('ul').children('li').click(clickChange);
                element.children('ul').children('li').click(processData);
//                显示那几个页签 传入任意li元素即可
                pageShow(element.children('ul').children('li[value = '+ pagenumber +']'))
            }else{
                console.log('分页自定义属性不合理')
            }
        };

写一个函数用来调用上面的initPagination函数,不直接调用pagination时因为有可能一个页面需要多个分页。

//        凡是带有pagination = p-new属性的元素,都会生成分页,这样设计方便一个页面中有多个不同的分页
        function paginationInit(){
            $('[pagination = p-new]').each(function(){
                initPagination($(this))
            })
        };

点击不同页签时候的样式变化。有两种情况:如果点击的是普通页签,此时点击谁就给谁对应的li添加.active样式。如果点击的是首位的上一页和下一页,那么就
需要给当前有.active的li元素的前一个或者后一个li添加.active样式。

//        点击页签时候样式的变化
        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');
                }
            });
//                点击页码页签
            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');
//                点击上一页页签
            }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');
                }
//                点击下一页页签
            }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');
                }
            }
        }

接下来这个有点意思。展示哪些页码。比如总共100页数据,我们的分页栏始终显示10页,那么这10页就需要动态的根据当前页、总页数而变化。我是找了一个其他的分页点了点去找第几页的时候显示哪些页码这个规律的。
代码看起来有点乱,不过自己找个其他网站的分页点几下就知道怎么写了。

//       展示哪些页码 要用一个实际的分页找规律
        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')
                    }
                });
            }
        }

我给每个li页签绑定了一个专门用来处理ajax的点击事件,当前所在的页码在全局可以获取到。可以处理切换页签时候发送ajax,根据不同页码返回不同数据。

//       页面切换时候的处理函数。比如发ajax根据不同页码获取不同数据展示数据等,用户自行配置。
        function processData(){
            console.log('当前页码',pagenumber);
//            用户在这里写页码切换时候的逻辑
        }

一个简单的通用分页就完成了,引入js后只需要写一个可配置属性的div标签就可以实现bootstrap风格的动态分页。还有很多地方需要完善,比如目前变量还声明在全局等等,时间原因就先到此为止啦。
完整代码我上传到了github。https://github.com/yanhaoqi/pagination-bootstorp.git

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容