用原生js手写分页功能

news2024/11/20 6:36:10

分页功能如下:

  1. 数据分页显示,每页显示若干条数据,默认当前页码为第一页。例如:每页5条数据,则第一页显示 1-5 条,第二页显示 6-10 条,依此类推。
  2. 当页码为第一页时,上一页为禁用状态,点击无任何变化。
  3. 当页码为最后一页时,下一页为禁用状态,点击无任何变化。
  4. 正确显示当前页数和总页数。

首先,要显示的数据如下:

// 课外书列表
  const bookList = [{
      "name": "带你从入门到实战全面掌握 uni-app",
      "price": 8900
    },
    {
      "name": "初中级前端工程师面试宝典",
      "price": 4900
    },
    {
      "name": "微信公众号开发入门",
      "price": 3900
    },
    {
      "name": "从零入门 React 通关指北",
      "price": 8900
    },
    {
      "name": "Flask 框架基础",
      "price": 9800
    },
    {
      "name": "JavaScript 从零构建音乐播放器",
      "price": 8900
    },
    {
      "name": "微信小程序开发入门",
      "price": 1490
    },
    {
      "name": "SpringBoot+Thymeleaf 开发 BBS 论坛",
      "price": 13900
    },
    {
      "name": "Vue.js 3 + Node.js 实现线上聊天室",
      "price": 8800
    },
    {
      "name": "Express.js 实现前后端分离的博客系统",
      "price": 8900
    },
    {
      "name": "经典项目:前后端分离网盘系统实战",
      "price": 8900
    },
    {
      "name": "21 个实验带你快速开发 Django 博客系统",
      "price":1000
    },
    {
      "name": "React Hook 打造精美在线记账本",
      "price": 8900
    },
    {
      "name":'红楼梦',
      "price": 5900
    },
    {
      "name": "Three.js 在网页中创建 3D 动画",
      "price": 6400
    },
    {
      "name": "Web 前端高级开发技术",
      "price": 16900
    }
  ]

html结构如下:

<body>
  <div id="list">
    <ul class="list-group">
      <li>书名:?,一本要10元</li>
      <li>书名:?,一本要10元</li>
      <li>书名:?,一本要10元</li>
      <li>书名:?,一本要10元</li>
    </ul>
  </div>
  <div>
    <button disabled="false" id="prev">上一页</button>
    <button id="next">下一页</button>
  </div>
  <p id="pagination">共?页,当前?页</p>
</body>

我们可以定义当前页数为pageNum,总页数为maxPage,每页显示的数据为limit条。

let pageNum = 1; // 当前页数,默认为1
const limit = 5; // 每页显示多少条数据
const maxPage = Math.ceil(bookList.length / limit); // 最大页数

当前显示数据索引受pageNum和limit影响。

如果是第一页,即pageNum为1时,则显示数据所对应的索引为04;第二页,pageNum为2时,为59;第三页,pageNum为3时,为10~14。

用变量来表示为:(pageNum-1)limit ~ pageNumlimit

所以,我们书写一个更新页面的函数,并在一开始的时候就调用该函数进行初始化页面。

// 更新页面数据(n当前页数)
function updataData(n) {
  const listGroup = document.querySelector(".list-group")
  const pagination = document.getElementById("pagination")
  // 清空所有数据
  listGroup.innerHTML = ''
  // 循环遍历每一条数据
  for (let i = (n - 1) * limit; i < n * limit; i++) {
    const obj = bookList[i]
    // 如果有值才添加到元素中。
    // 防止在最后一页时,数据条数小于limit,获取的obj为undefind,出现报错。
    obj && (listGroup.innerHTML += `<li>书名:《${obj.name}》,价格为${obj.price}元</li>`)
  }
  // 更新当前页数和总页数
  pagination.innerHTML = `共${maxPage}页,当前${pageNum}页`
}

在点击下一页按钮时,需要更新当前页数(pageNum++)和当前页面显示的数据(调用updataData函数),最终还要更新按钮的状态,如果已经到了最后一页,则要将下一页按钮的状态设置为无法选中。

const prev = document.getElementById("prev");
// 点击下一页
next.onclick = function () {
  // 如果当前页是最后一页了,则不做任何操作
  if (pageNum === maxPage) return
  pageNum++
  updataData(pageNum)
  next.disabled = pageNum >= maxPage ? true : false
};

不过这样做有个问题,”上一页”按钮一开始就被设置为disabled,点击下一页,也就是跳转到第2页的时候,此时还是不能点击上一页按钮。

因此,在点击下一页时,还要根据当前页数,改变上一页按钮的状态,我们可以定义一个函数来实现更新按钮状态。

// 更新按钮状态
function updateBtnStatu(pageNum) {
  prev.disabled = pageNum <= 1 ? true : false
  next.disabled = pageNum >= maxPage ? true : false
}
const next = document.getElementById("next");
// 点击下一页
next.onclick = function () {
    // 如果当前页是最后一页了,则不做任何操作
    if (pageNum === maxPage) return
    pageNum++
    updataData(pageNum)
    updateBtnStatu(pageNum)
  };

点击上一页同理。

// 更新按钮状态
const prev = document.getElementById("prev");
// 点击上一页
prev.onclick = function () {
  // 如果当前页是第一页,则不做任何操作
  if (pageNum === 1) return
  pageNum--
  updataData(pageNum)
  updateBtnStatu(pageNum)
};

源代码如下:

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <style>
    * {
      margin: 0;
      padding: 0;
      box-sizing: border-box;
    }

    body {
      text-align: center;
    }

    li {
      list-style: none;
      margin-bottom: 20px;
    }

    #list {
      width: 450px;
      height: 300px;
      margin: 30px auto;
      text-align: center;
      padding: 20px;
      border: 3px solid skyblue;
    }
  </style>
</head>

<body>
  <div id="list">
    <ul class="list-group">
      <li>书名:?,一本要10元</li>
      <li>书名:?,一本要10元</li>
      <li>书名:?,一本要10元</li>
      <li>书名:?,一本要10元</li>
    </ul>
  </div>
  <div>
    <button disabled="false" id="prev">上一页</button>
    <button id="next">下一页</button>
  </div>
  <p id="pagination">共?页,当前?页</p>
</body>
<script>
  // 课外书列表
  const bookList = [{
      "name": "带你从入门到实战全面掌握 uni-app",
      "price": 8900
    },
    {
      "name": "初中级前端工程师面试宝典",
      "price": 4900
    },
    {
      "name": "微信公众号开发入门",
      "price": 3900
    },
    {
      "name": "从零入门 React 通关指北",
      "price": 8900
    },
    {
      "name": "Flask 框架基础",
      "price": 9800
    },
    {
      "name": "JavaScript 从零构建音乐播放器",
      "price": 8900
    },
    {
      "name": "微信小程序开发入门",
      "price": 1490
    },
    {
      "name": "SpringBoot+Thymeleaf 开发 BBS 论坛",
      "price": 13900
    },
    {
      "name": "Vue.js 3 + Node.js 实现线上聊天室",
      "price": 8800
    },
    {
      "name": "Express.js 实现前后端分离的博客系统",
      "price": 8900
    },
    {
      "name": "经典项目:前后端分离网盘系统实战",
      "price": 8900
    },
    {
      "name": "21 个实验带你快速开发 Django 博客系统",
      "price": 1000
    },
    {
      "name": "React Hook 打造精美在线记账本",
      "price": 8900
    },
    {
      "name": '红楼梦',
      "price": 5900
    },
    {
      "name": "Three.js 在网页中创建 3D 动画",
      "price": 6400
    },
    {
      "name": "Web 前端高级开发技术",
      "price": 16900
    }
  ]
  let pageNum = 1; // 当前页数,默认为1
  const limit = 5; // 每页显示多少条数据
  const maxPage = Math.ceil(bookList.length / limit); // 最大页数
  const prev = document.getElementById("prev");
  const next = document.getElementById("next");

  // 初始化数据
  updataData(pageNum)

  // 更新页面数据(n当前页数)
  function updataData(n) {
    const listGroup = document.querySelector(".list-group")
    const pagination = document.getElementById("pagination")
    // 清空所有数据
    listGroup.innerHTML = ''
    // 循环遍历每一条数据
    for (let i = (n - 1) * limit; i < n * limit; i++) {
      const obj = bookList[i]
      // 如果有值才添加到元素中。
      // 防止在最后一页时,数据条数小于limit,获取的obj为undefind,出现报错。
      obj && (listGroup.innerHTML += `<li>书名:《${obj.name}》,价格为${obj.price}元</li>`)
    }
    // 更新当前页数和总页数
    pagination.innerHTML = `${maxPage}页,当前${pageNum}`
  }

  // 更新按钮状态
  function updateBtnStatu(pageNum) {
    prev.disabled = pageNum <= 1 ? true : false
    next.disabled = pageNum >= maxPage ? true : false
  }

  // 点击上一页
  prev.onclick = function () {
    // 如果当前页是第一页,则不做任何操作
    if (pageNum === 1) return
    pageNum--
    updataData(pageNum)
    updateBtnStatu(pageNum)
  };

  // 点击下一页
  next.onclick = function () {
    // 如果当前页是最后一页了,则不做任何操作
    if (pageNum === maxPage) return
    pageNum++
    updataData(pageNum)
    updateBtnStatu(pageNum)
  };
</script>

</html>

最终实现的效果如下:
请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/388177.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IronPDF for .NET 2023.2.4 Crack

适用于 .NET 2023.2.4 的 IronPDF 添加对增量 PDF 保存的支持。 2023 年 3 月 2 日 - 10:23新版本 特征 添加了对 IronPdfEngine Docker 的支持。 添加了对增量 PDF 保存的支持。 重新设计了 PDF 签名和签名。 删除了 iTextSharp 依赖项。 在文本页眉/页脚中添加了 DrawDivider…

laravel8多模块、多应用和多应用路由

1、安装多应用模块 composer require nwidart/laravel-modules2、执行命令&#xff0c;config文件夹下生成一个modules.php配置文件 php artisan vendor:publish --provider"Nwidart\Modules\LaravelModulesServiceProvider"3、修改config文件夹下的modules.php&am…

python爬虫学习之路

【2023.3.3】一、爬虫概念 通过编写程序&#xff0c;模拟浏览器上网&#xff0c;然后让其去互联网上抓取数据的过程。 价值&#xff1a; 抓取互联网上的数据&#xff0c;为我所用&#xff0c;有了大量的数据&#xff0c;就如同有了一个数据银行一样&#xff0c;下一步做的就是如…

程序员怎么写出亮眼的简历?

要随时与正能量的人保持同行&#xff0c;因为他的心一直在靠近远方 什么是简历 我们先看下百度百科对于简历的描述&#xff1a; 可以看出&#xff0c;简历是受法律规定&#xff0c;因为简历本身的信息真实性较高&#xff0c;所以简历一直是早期被市场上进行数据交易的重要载…

windows 下 python 和repo 下载安装环境变量配置

repo 安装成功&#xff0c;但是下载代码 repo init的时候出错 不知道是不是repo windows版本有问题 python 最好下载2.6-2.7版本的 Python Releases for Windows | Python.org 不然下载代码会有问题&#xff0c;下不了&#xff0c;会提示安装2.6-2.7版本的 Windows下成功安…

人机界面艺术设计

人机界面艺术设计 2.1人机界面艺术设计思路 人们经常有意通过某种工具或创造来解决难题&#xff0c;然而这并不意味着人们乐于接受别人或其他事情&#xff0c;他们很难提出问题。在用户使用网页或软件的时候&#xff0c;他们有明确的目标&#xff0c;他们利用电脑来帮助自己达…

Hbase RegionServer的核心模块

RegionServer是HBase系统中最核心的组件&#xff0c;主要负责用户数据写入、读取等基础操作。RegionServer组件实际上是一个综合体系&#xff0c;包含多个各司其职的核心模块&#xff1a;HLog、MemStore、HFile以及BlockCache。 一、RegionServer内部结构 RegionServer是HBas…

Altium Designer PCB孤岛铜的去除方法教程

孤岛铜&#xff0c;也叫死铜&#xff0c;是指在PCB中孤立无连接的铜箔&#xff0c;一般都是在敷铜的时候产生&#xff0c;不利于生产。解决的办法比较简单&#xff0c;可以手工连线将其与同网络的铜箔相连&#xff0c;也可以通过打过孔的方式将其与同网络的铜箔相连。无法解决的…

Biomod2 (下):物种分布模型建模

这里写目录标题1.给出一个线性回归模型并求出因子贡献度2.biomod22.1 pseudo-absences:伪不存在点&#xff08;PA&#xff09;2.1.1 random2.2.2 disk2.2.3 user.defined method3.使用网格划分区域3.1 计算质心4. 完整案例1.给出一个线性回归模型并求出因子贡献度 ##---------…

【游戏逆向】FPS游戏玩家对象数据分析

玩家健康值 查找玩家健康值,玩家健康值是100,但是我们并不知道数值类型,我们可以使用精确搜索方式搜索100-所有类型 CE搜索 结果很多,我们可以使用手雷来减少血量 我们会得到两个结果 我们可以去尝试改变数值,最终发现一个是我们的客户端健康值,一个是服务器健康值,…

Java——N皇后问题

题目链接 leetcode在线oj题——N皇后 题目描述 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff…

RocketMQ Broker消息处理流程剩余源码解析

&#x1f34a; Java学习&#xff1a;Java从入门到精通总结 &#x1f34a; 深入浅出RocketMQ设计思想&#xff1a;深入浅出RocketMQ设计思想 &#x1f34a; 绝对不一样的职场干货&#xff1a;大厂最佳实践经验指南 &#x1f4c6; 最近更新&#xff1a;2023年3月4日 &#x1…

CCNP350-401学习笔记(补充题目1-100)

1、wireless client to roam --->> wireless client 2、Cisco aWIPS policies on the WLC 3、 import json -->> while true -->>except -->> File open -->>File.close() -->> File.open() 4、 login console group radius 5、undesir…

大数据框架之Hadoop:MapReduce(七)MapReduce扩展案例

一、倒排索引案例&#xff08;多job串联&#xff09; 1、需求 有大量的文本&#xff08;文档、网页&#xff09;&#xff0c;需要建立搜索索引&#xff0c;如图4-31所示。 &#xff08;1&#xff09;数据输入 &#xff08;2&#xff09;期望输出数据 atguigu c.txt–>2…

VS2022+Qt5.14.2成功编译MITK2022.10

目录 一 编译结果 二 编译问题解决 三 参考链接 一 编译结果 二 编译问题解决 error C2220错误 1> mitkSlicedGeometry3D.cpp 1>D:\MITK\src\MITK-2022.10\Modules\Core\src\DataManagement\mitkSlicedGeometry3D.cpp(1,1): error C2220: 以下警告被视为错误 [D:\MI…

能代替try catch处理异常的优雅方式

前言软件开发过程中&#xff0c;不可避免的是需要处理各种异常&#xff0c;就我自己来说&#xff0c;至少有一半以上的时间都是在处理各种异常情况&#xff0c;所以代码中就会出现大量的try {…} catch {…} finally {…} 代码块&#xff0c;不仅有大量的冗余代码&#xff0c;而…

【办公类-19-03】办公中的思考——Python批量统一文件名的序号(保教主任整理打印文件)

背景需求&#xff1a;为迎接督导检查&#xff0c;保教主任从各条线收集文本资料。并在每个文件名称前手动编号。但是她嘀咕道&#xff1a;”为什么两套资料放在一个文件里就不是按照数字序号排序&#xff1f;&#xff0c;有的是1X-&#xff0c;有的是40X&#xff0c;看起来很乱…

20230304 CF855 div3 vp

Dashboard - Codeforces Round 855 (Div. 3) - Codeforces呃呃&#xff0c;评价是&#xff0c;毫无进步呃呃呃呃呃呃呃呃呃呃呃呃呃呃呃呃呃该加训了该加训了该加训了该加训了该加训了该加训了该加训了该加训了该加训了该加训了该加训了该加训了该加训了该加训了该加训了该加训…

有关平方或高次方的公式整理一元高次方程的求解

Part.I Introduction 这篇博文记录一下数学中常用的有关平方或高次方的一些公式。 Chap.I 一些结论 下面一部分汇总了一些重要的结论 完全平方公式&#xff1a;(ab)2a22abb2(ab)^2a^22abb^2(ab)2a22abb2平方差公式&#xff1a;a2−b2(ab)(a−b)a^2-b^2(ab)(a-b)a2−b2(ab)(…

Spring——Bean管理-注解方式进行属性注入

Spring针对Bean管理中创建对象提供的注解有哪些&#xff1f;Component&#xff1a;普通Service&#xff1a;业务逻辑层Controller&#xff1a;controller层Repository&#xff1a;dao层用注解的方式是为什么&#xff1f;简化xml方式开发&#xff0c;只需要注解就可以完成在配置…