分页的实现

<!doctype html>
<html lang="zh">
<head>
    <meta charset="utf-8">
    <title>分页(Pagination)</title>
    <link rel="stylesheet" type="text/css" href="./bootstrap-4.6.2-dist/css/bootstrap.min.css">
</head>
<body>
<nav aria-label="Page navigation example" style="margin-top:250px;">
    <ul class="pagination justify-content-center"></ul>
</nav>
<script type="text/jscript" src="./jquery.min.js"></script>
<script type="text/javascript">
    // 地址样板:https://www.example.com/test.html?sex=2&birth=2008&page={$page}
    // 演示地址:https://www.example.com/test.html?sex=2&birth=2008&page=16

    /**
     * 获取URL参数
     *
     * @param name string 参数名,如果为“*”则获取所有参数(对象格式)
     * @param defaultValue mixed 参数不存在时使用的默认值,仅在name参数不为“*”时有效
     * @return {mixed} 参数值
     */
    function urlSearchParamsGet(name, defaultValue) {
        let value = null;

        if (name !== '*') {
            value = (new URLSearchParams((new URL(window.location.href)).search)).get(name);

            if (value === null) {
                value = defaultValue;
            }
        } else {
            value = {};

            let entries = (new URLSearchParams((new URL(window.location.href)).search)).entries();
            for (let param of entries) {
                value[param[0]] = param[1];
            }
        }

        return value;
    }

    /**
     * 获取URL样板
     *
     * @return {string}
     */
    function urlPattern() {
        let params = urlSearchParamsGet('*', {}); // 从URL获取所有GET参数(对象格式)

        'page' in params && delete params.page; // 删除对象的page属性(如果有的话)

        // 转成查询字符串,即“key1=value1&key2=value2&key3=value3”格式
        let query = Object.keys(params).map(key => key + '=' + params[key]).join('&');

        // 构造列表页URL模板
        let url = './test.html?';
        url += (query !== '') ? (query + '&page={$page}') : 'page={$page}';

        return url;
    }

    /**
     * 显示分页内容
     *
     * @param count int 符合查询条件的记录总数
     */
    function pagination(count) {
        // 至少有一条符合查询条件的记录才需要显示页码
        if (count > 0) {
            let max = 10; // 最多显示几个数字页码(不包含首页、上一页、下一页、尾页)

            let total = Math.ceil(count / size); // 计算出总页数
            let page = parseInt(urlSearchParamsGet('page', 1)); // 当前页码
            let url = urlPattern();

            if (page > total) {
                page = total;
            }

            console.log('为您找到%d条记录,共%d页(每页显示%d条),当前为第%d页', count, total, size, page);

            let item = function (p) {
                let li = '';

                if (page === p) {
                    li = '<li class="page-item active"><a class="page-link" href="javascript:;">' + p + '</a></li>';
                } else {
                    li = '<li class="page-item"><a class="page-link" href="' + url.replace('{$page}', p) + '">' + p + '</a></li>';
                }

                return li;
            };

            let range = function (start, end) {
                let pagination = '';

                for (let p = start; p <= end; p++) {
                    pagination += item(p);
                }

                return pagination;
            }

            // 上一页
            let prev = function (p) {
                let li = '';

                if (p > 0) {
                    li = '<li class="page-item"><a class="page-link" href="' + url.replace('{$page}', p) + '">上一页</a></li>';
                }

                return li;
            };

            // 下一页
            let next = function (p) {
                let li = '';

                if (p <= total) {
                    li = '<li class="page-item"><a class="page-link" href="' + url.replace('{$page}', p) + '">下一页</a></li>';
                }

                return li;
            };

            // 首页
            let first = function () {
                let li = '';

                if (page !== 1) {
                    li = '<li class="page-item"><a class="page-link" href="' + url.replace('{$page}', 1) + '">首页</a></li>';
                }

                return li;
            };

            // 尾页
            let last = function () {
                let li = '';

                if (page !== total) {
                    li = '<li class="page-item"><a class="page-link" href="' + url.replace('{$page}', total) + '">尾页</a></li>';
                }

                return li;
            };

            let start = Math.max(page - Math.floor(max / 2), 1); // 计算出起始页码
            let end = Math.min(start + max - 1, total); // 计算出结束页码

            // 如果结束页码等于总页数,需要调整起始页码,使数字页码达到max个
            if (end === total) {
                start = Math.max(total - max + 1, 1);
            }

            // 页码数字部分
            let pagination = range(start, end);

            // 加上其它内容:首页、上一页、下一页、尾页
            pagination = first() + prev(page - 1) + pagination + next(page + 1) + last();

            $('ul.pagination').html(pagination);
        }
    }

    let size = 10; // 每页显示记录数(需传递给后端用于查询分页数据)

    // 这里假设通过AJAX请求获取到了分页相关数据
    let count = 1024; // 符合查询条件的记录总数

    pagination(count);
</script>
</body>
</html>

Copyright © 2024 码农人生. All Rights Reserved