JS实现简单分页,页码显示

分页有许多插件可以实现,现在想试着写一个自己的分页。

分页有这几个问题需要解决,本文先讨论页码显示问题

页码显示 
上一页,下一页链接
输入页码(可选)
后台交互

页面显示需求

当前页码前后显示 3 页,然后需要显示第一页最后一页 未显示的页码用省略号表示。

举例:如果总共 110 页

当前页码为 1,那么显示 1 2 3 4 ... 110 下一页

当前页码为 2,那么显示 上一页 1 2 3 4 5 ... 110 下一页

当前页码为 3,那么显示 上一页 1 2 3 4 5 6 ... 110 下一页

当前页码为 4,那么显示 上一页 1 2 3 4 5 6 7 ... 110 下一页

当前页码为 5,那么显示 上一页 1 2 3 4 5 6 7 8 ... 110 下一页

当前页码为 6,那么显示 上一页 1 ... 3 4 5 6 7 8 9 ... 110 下一页



当前页码为 100,那么显示 上一页 1 ... 97 98 99 100 101 102 103 ... 110 下一页



当前页码为 109,那么显示 上一页 1 ... 106 107 108 109 110 下一页

当前页码为 110,那么显示 上一页 1 ... 107 108 109 110


虽然每一页在实际应用中都是一个超链接,但是我们在思考算法时可以先将其忽略。

现在就变成了一个简单的字符串输出题。


下面是代码部分

先定义一个函数

function showPages (page, total) {
 
}

准备好覆盖所有情况的测试。

这个题就简单咯,我们可以把所有结果都打印出来呗。

在无需引入一个代码测试库的情况下,我们来这么干

var total = 110;  
for (var i = 1; i <= total; i++) {  
    var ret = showPages(i, total);
    console.log(ret);
}
就从页码为 1 到最后一页的结果全输出出来了。

解决问题的思维模式。

function showPages (page, total) {
        var str = page + '';
 
        for (var i = 1; i <= 3; i++) {
            if (page - i > 1) {
                str = page - i + ' ' + str;
            }
            if (page + i < total) {
                str = str + ' ' + (page + i);
            }
        }
 
        if (page - 4 > 1) {
            str = '... ' + str;
        }
 
        if (page > 1) {
            str = '上一页 ' + 1 + ' ' + str;
        }
 
        if (page + 4 < total) {
            str = str + ' ...';
        }
 
        if (page < total) {
            str = str + ' ' + total + ' 下一页';
        }
 
        return str;
    }
把一些简单的 html 代码补充完整

...
 
        var str = '<a>' + page + '</a>';
 
        for (var i = 1; i <= 3; i++) {
            if (page - i > 1) {
                str = '<a class="page">' + (page - i) + '</a> ' + str;
            }
            if (page + i < total) {
                str = str + ' ' + (page + i);
            }
        }
 
...
大概是可以实现通用分页的思路。
function showPageCommon(config) {  
    return function (page, total) {
        var str = '<a>' + page + '</a>';
 
        for (var i = 1; i <= 3; i++) {
            if (page - i > 1) {
                str = '<a class="' + config.color + '">' + (page - i) + '</a> ' + str;
            }
            if (page + i < total) {
                str = str + ' ' + (page + i);
            }
        }
 
        if (page - 4 > 1) {
            str = '... ' + str;
        }
 
        if (page > 1) {
            str = '上一页 ' + 1 + ' ' + str;
        }
 
        if (page + 4 < total) {
            str = str + ' ...';
        }
 
        if (page < total) {
            str = str + ' ' + total + ' 下一页';
        }
 
        return str;
    }
}
 
var showPages = showPageCommon({  
    color: 'red'
});
 
var total = 110;  
for (var i = 1; i <= total; i++) {  
    var ret = showPages(i, total);
    console.log(ret);
}
 
var showPages = showPageCommon({  
    color: 'blue'
});
 
var total = 110;  
for (var i = 1; i <= total; i++) {  
    var ret = showPages(i, total);
    console.log(ret);
}
在浏览器控制台可以得到结果。稍微修改
var total = 110;
        for (var i = 1; i <= total; i++) {
            var ret = showPages(i, total);
            console.log(ret);
            document.write(ret);
加一句
document.write(ret);
就可以在浏览器中得到分页显示结果了。

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值