使用html+js书写分页功能

2023-10-30

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        ul,li{
            margin:0;
            padding:0;
            list-style: none;
        }
        .v-pagination{
            display:flex;
            align-items: center;
        }
        .v-pagination .pagination-page{
            display:flex;
            align-items: center;
            margin-left:40px;
        }
        .v-pagination .page{
            height: 28px;
            line-height: 28px;
            margin: 0 5px;
            background-color: #f4f4f5;
            color: #606266;
            min-width: 30px;
            text-align: center;
            border-radius: 2px;
            font-size:13px;
            cursor: pointer;
        }
        .v-pagination .page.selected{
            background-color: #409eff;
            color: #fff;
        }
    </style>
</head>
<body>
    <!-- 隐藏的数据总数 -->
    <span class="data-total" style="display:none">123</span>
    <div class="v-pagination">
        <span class="total">总数为:0</span>
        <ul class="pagination-page">
            
        </ul>
    </div>    
    <script>
        // 获取URL上的参数,返回参数对象
        function getURLParams(url=""){
          const result = {};
          if(url.includes('?') === true){
            url.split('?')[1].split('&').map(item=>{
              const [key,value] = item.split('=');
              result[key] = value;
            });
          }
          return result;
        }
        // 将对象装换成url上的查询参数
        function rechangeURL(url='',json={}){
            let path = url.split('?')[0];
            Object.keys(json).forEach((key,index)=>{
                console.log(key,index);
                path += index === 0 ? '?' : '&';
                path += `${key}=${json[key]}`;
            });
            return path;
        }

        // 根据数据总数、每页大小、当前的下标展示不同的分页
        function generatePage(total = 0,pageSize = 10,currentPage = 1){
            // 总条数
            const theTotal = Number(total);
            // 每页大小
            const thePageSize = Number(pageSize);
            // 当前页
            const theCurrentPage = Number(currentPage);
            if(isNaN(theTotal) || isNaN(thePageSize) || isNaN(theCurrentPage)){
                return '传入的参数必须为数字,或者字符串类型的数字';
            }
            // 总页数
            const totalPage = Math.ceil(theTotal / thePageSize) || 1;
            // 当前下标减1的元素
            let html = `<li class="page" index="${theCurrentPage - 1 < 1 ? 1 : theCurrentPage - 1}"><</li>`;
            if(totalPage <= 5){
                // 当总页数不满5页时
                for(let i = 1 ;i <= totalPage; i++){
                    if(i === theCurrentPage){
                        html += `<li class="page selected" index="${i}">${i}</li>`;
                    }else{
                        html += `<li class="page" index="${i}">${i}</li>`;
                    }
                }
            }else{
                // 当总页数超过5页时
                if(theCurrentPage - 2 > 1){
                    // 在最开始增加【第1页】和【...页】
                    html += `
                        <li class="page" index="1">1</li>
                        <li class="page" index="${theCurrentPage - 5 < 1 ? 1 : theCurrentPage - 5}">...</li>
                    `
                }
                // 具体展示的开头
                const begin = theCurrentPage - 2 < 1 ? 1: theCurrentPage - 2;
                // 具体展示的结尾
                const end = theCurrentPage + 2 > totalPage ? totalPage : theCurrentPage + 2;
                for(let i =  begin;i <= end; i++){
                    if(i === theCurrentPage){
                        html += `<li class="page selected" index="${i}">${i}</li>`;
                    }else{
                        html += `<li class="page" index="${i}">${i}</li>`;
                    }
                }
                if(theCurrentPage + 2 < totalPage){
                    // 在最后增加【...页】和【最后页】
                    html += `
                        <li class="page" index="${theCurrentPage + 5 > totalPage ? totalPage : theCurrentPage + 5}">...</li>
                        <li class="page" index="${totalPage}">${totalPage}</li>
                    `
                }
            }
            // 当前下标加1的元素
            html += `<li class="page" index="${theCurrentPage + 1 > totalPage ? totalPage : theCurrentPage + 1}">></li>`;
            // 加载到DOM中
            document.querySelector('.v-pagination .pagination-page').innerHTML = html;
        }

        window.addEventListener('load',()=>{
            // 使用事件委托绑定分页点击事件
            document.querySelector('.v-pagination .pagination-page').addEventListener('click',function(e){
                const {nodeName,innerText} = e.target;
                const currentPage = e.target.getAttribute('index');
                if(nodeName === 'LI'){
                    // 触发的是分页的事件
                    location.href=rechangeURL(location.href,{...params,_pi:currentPage});
                }
            });

        });

        // 初始化,获取url上传递过来的当前页和分页大小
        const params = getURLParams(location.href);
        // 在DOM上获取分页大小
        const total = document.querySelector('.data-total').innerText;
        // 赋值分页总数
        document.querySelector('.total').innerText = `总数为:${total}`;
        // 生成分页元素
        generatePage(total,params._ps,params._pi);
        console.log(total,params);
    </script>
</body>
</html>

 浏览器展示效果(分页的当前下标和每页大小是从地址栏获取的,展示的总条数从DOM中获取的)

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用html+js书写分页功能 的相关文章

随机推荐

  • 十分钟内学会:让GridView支持按行选中及多选

    Question 如何能让GridView支持选中多行 并且PostBack时要能确定哪些行有被选中哪些行没被选中 Answer 网上关于GridView多选的实现方式的讨论也不少 有一些需要直接输出
  • React 基础入门

    React 起源于 Facebook 内部项目 是一个用来构建用户界面的 Javascript 库 相当于MVC架构中的V层框架 与市面上其他框架不同的是 React 把每一个组件当成了一个状态机 组件内部通过 state 来维护组件状态的
  • Unity Global Illumination(Unity 全局光照 ) 官方手册笔记系列之Global Illumination(全局光照)

    Global Illumination 全局光照 本文档主要是对Unity官方手册的个人理解与总结 其实以翻译记录为主 gt 仅作为个人学习使用 不得作为商业用途 欢迎转载 并请注明出处 文章中涉及到的操作都是基于Unity2018 1版本
  • 著名的图像检索系统

    1 QBIC Query By Image Content 图像检索系统是 IBM 公司 90年代开发制作的图像和动态景象检索系统 是第一个基于内容的商业化的图像检索系统 QBIC 系统提供了多种的查询方式 包括 利用标准范图 系统自身提供
  • 2021第十二届蓝桥杯Python组

    A卡片 cards 2021 10 i 1 while True s str i for j in s cards int j 1 flag False for j in cards if j lt 0 flag True break if
  • 元胞数组是什么?

    https www jianshu com p 525a788bbe68
  • python基础编程—综合实训

    一 实训要求 要求完成下列程序的功能 给出程序的源代码及运行效果截图 1 编写程序 根据下表提供的数据编写程序 实现快递计费系统 快递行业高速发展 我们邮寄物品变得方便快捷 某快递点提供华东地区 华南地区 华北地区的寄件服务 其中华东地区编
  • 1-linux初始化-hadoop

    系统初始化 1 网络配置 编辑文件 vi etc sysconfig network scripts ifcfg 网卡名 插入 IPADDR 192 168 200 10 GATEWAY 192 168 200 2 NETMASK 255
  • 最全idea java连接mysql数据库中文乱码解决方案

    相信不少人都遇到过中文乱码的问题 今天整理一篇解决乱码问题的文章分享给大家 中文乱码总逃脱不了编码格式以及匹配的问题 1 修改idea文件编码格式 idea File settings editor File Encodings 2 如果还
  • 第一批被AI淘汰的人已经出现,你距离失业还有多远?

    在我之前的文章有提到过 当chat GPT横空出世之后 AI必然会迎来大爆发 在chat GPT推出后 百度随即推出文心一言 而各个互联网大厂也纷纷入局 这将会导致一大批人失业 为什么各个互联网大厂会纷纷入局 他们不是人傻钱多 而是看到其背
  • 【Redis】主从复制和哨兵模式

    主从复制 主从复制 主机数据更新后根据配置和策略 自动同步到备机的master slaver机制 Master以写为主 Slave以读为主 作用 读写分离 性能扩展 容灾快速恢复 主从复制的配置 在我的 myredis目录中 存在redis
  • 太阳能路灯实际功率怎么计算?

    太阳能路灯实际功率怎么计算 李老师给朋友们分享测量法和计算法两个方式来得出太阳能路灯实际功率 一 最简单的就是太阳能路灯正常亮灯的时候用钳流表测试控制器负载输出端的电流和电压 两者相乘 得到实际输出功率 直流钳流表 二 通过太阳能板功率和锂
  • 2021-11-05 Leetcood 160 每日一题

    R星校长 已知两个单链表的头节点 headA 和 headB 请你找出并返回两个单链表相交的起始节点 如果两个链表没有交点 返回 null 杰哥我用白话翻译过来 链表A和链表B相交于C节点 我们返回C节点的地址 如果两个链表之间没有交点 程
  • jmeter性能测试常用插件简介

    jmeter性能测试常用插件简介 jmeter作为一个开源的接口性能测试工具 相对于商业性软件loadrunner来说 优点是更加灵活方便 操作简单 但相对来说 专业性和对性能参数的分析相对比较薄弱 但是通过第三方插件 就能将一些重要的参数
  • OpenCV 的浅拷贝和深拷贝,千万不要踩坑了!

    最近在使用 OpenCV 进行图像处理时 遇到一个小坑 这里总结一下 希望能对你有帮助 将一个变量赋给另一个变量 直接使用 符号即可 不过在 OpenCV 中就会遇到问题 Mat a b a b 都为 Mat 类型 这类拷贝方法是浅拷贝 没
  • 矩阵的逆以及实际应用

    矩阵逆的实际应用 最常见的是解线性方程组Ax b 如果A可逆 则解是x A 1 b 这类例子太多了 例如 小花 小明钱包里面各有几百元 小花金额的2倍和小明的金额 加起来是300元 小花金额的10倍比小明的金额对9倍 还多100元 则联立方
  • C语言之:数组的定义和初始化必备练习题

    1 作业标题 688 关于一维数组初始化 下面哪个定义是错误的 作业内容 A int arr 10 1 2 3 4 5 6 B int arr 1 2 3 4 5 6 C int arr 1 2 3 4 5 6 D int arr 10 0
  • Centos7安装Python2.7

    1 删除现有Python root test rpm qa grep python xargs rpm ev allmatches nodeps 强制删除已安装程序及其关联 root test whereis python xargs rm
  • 若依系统去redis

    1 注释 application yml文件中关于redis中所有的代码 2 修改framework模块下 RedisConfig该文件 删除也可以 3 在common模块中新建MyCache继承Cache类 package com xxx
  • 使用html+js书写分页功能